Packages

✨ Generate Gleam SDKs from OpenAPI specifications

Current section

Files

Jump to
gilly src gilly@openapi@openapi.erl
Raw

src/gilly@openapi@openapi.erl

-module(gilly@openapi@openapi).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gilly/openapi/openapi.gleam").
-export([openapi_decoder/0, from_json_string/1]).
-export_type([server/0, open_a_p_i/0, info/0, components/0, path_item/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type server() :: {server, binary()}.
-type open_a_p_i() :: {open_a_p_i,
gilly@openapi@version:version(),
info(),
list(server()),
list({binary(), path_item()}),
gleam@option:option(components())}.
-type info() :: {info, binary(), binary(), gleam@option:option(binary())}.
-type components() :: {components,
list({binary(), gilly@openapi@schema:schema()})}.
-type path_item() :: {path_item,
gleam@option:option(gilly@openapi@operation:operation()),
gleam@option:option(gilly@openapi@operation:operation()),
gleam@option:option(gilly@openapi@operation:operation()),
gleam@option:option(gilly@openapi@operation:operation()),
gleam@option:option(gilly@openapi@operation:operation())}.
-file("src/gilly/openapi/openapi.gleam", 27).
-spec server_decoder() -> gleam@dynamic@decode:decoder(server()).
server_decoder() ->
gleam@dynamic@decode:field(
<<"url"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Url) -> gleam@dynamic@decode:success({server, Url}) end
).
-file("src/gilly/openapi/openapi.gleam", 65).
?DOC(" Handle decode errors by converting them into our custom `Error` type.\n").
-spec handle_decode_errors(list(gleam@dynamic@decode:decode_error())) -> gilly@openapi@error:error().
handle_decode_errors(Errors) ->
Version_unsupported = gleam@list:find_map(
Errors,
fun(E) ->
{decode_error, Expected, _, _} = E,
case gleam@string:split_once(
Expected,
<<"Unsupported OpenAPI version: "/utf8>>
) of
{ok, {_, Version}} ->
{ok, Version};
{error, _} ->
{error, E}
end
end
),
case Version_unsupported of
{ok, Version@1} ->
{unsupported_version, Version@1};
{error, _} ->
{parse_error, Errors}
end.
-file("src/gilly/openapi/openapi.gleam", 84).
-spec info_decoder() -> gleam@dynamic@decode:decoder(info()).
info_decoder() ->
gleam@dynamic@decode:field(
<<"title"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Title) ->
gleam@dynamic@decode:field(
<<"version"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Version) ->
gleam@dynamic@decode:optional_field(
<<"description"/utf8>>,
none,
gleam@dynamic@decode:optional(
{decoder, fun gleam@dynamic@decode:decode_string/1}
),
fun(Description) ->
gleam@dynamic@decode:success(
{info, Title, Version, Description}
)
end
)
end
)
end
).
-file("src/gilly/openapi/openapi.gleam", 99).
-spec components_decoder() -> gleam@dynamic@decode:decoder(components()).
components_decoder() ->
gleam@dynamic@decode:field(
<<"schemas"/utf8>>,
begin
_pipe = gleam@dynamic@decode:dict(
{decoder, fun gleam@dynamic@decode:decode_string/1},
gilly@openapi@schema:schema_decoder()
),
gleam@dynamic@decode:map(_pipe, fun maps:to_list/1)
end,
fun(Schemas) -> gleam@dynamic@decode:success({components, Schemas}) end
).
-file("src/gilly/openapi/openapi.gleam", 118).
-spec path_item_decoder() -> gleam@dynamic@decode:decoder(path_item()).
path_item_decoder() ->
gleam@dynamic@decode:optional_field(
<<"get"/utf8>>,
none,
gleam@dynamic@decode:optional(
gilly@openapi@operation:operation_decoder()
),
fun(Get) ->
gleam@dynamic@decode:optional_field(
<<"post"/utf8>>,
none,
gleam@dynamic@decode:optional(
gilly@openapi@operation:operation_decoder()
),
fun(Post) ->
gleam@dynamic@decode:optional_field(
<<"put"/utf8>>,
none,
gleam@dynamic@decode:optional(
gilly@openapi@operation:operation_decoder()
),
fun(Put) ->
gleam@dynamic@decode:optional_field(
<<"delete"/utf8>>,
none,
gleam@dynamic@decode:optional(
gilly@openapi@operation:operation_decoder()
),
fun(Delete) ->
gleam@dynamic@decode:optional_field(
<<"patch"/utf8>>,
none,
gleam@dynamic@decode:optional(
gilly@openapi@operation:operation_decoder(
)
),
fun(Patch) ->
gleam@dynamic@decode:success(
{path_item,
Get,
Post,
Put,
Delete,
Patch}
)
end
)
end
)
end
)
end
)
end
).
-file("src/gilly/openapi/openapi.gleam", 32).
-spec openapi_decoder() -> gleam@dynamic@decode:decoder(open_a_p_i()).
openapi_decoder() ->
gleam@dynamic@decode:field(
<<"info"/utf8>>,
info_decoder(),
fun(Info) ->
gleam@dynamic@decode:field(
<<"openapi"/utf8>>,
gilly@openapi@version:version_decoder(),
fun(Version) ->
gleam@dynamic@decode:optional_field(
<<"servers"/utf8>>,
[],
gleam@dynamic@decode:list(server_decoder()),
fun(Servers) ->
gleam@dynamic@decode:optional_field(
<<"paths"/utf8>>,
[],
begin
_pipe = gleam@dynamic@decode:dict(
{decoder,
fun gleam@dynamic@decode:decode_string/1},
path_item_decoder()
),
gleam@dynamic@decode:map(
_pipe,
fun maps:to_list/1
)
end,
fun(Paths) ->
gleam@dynamic@decode:optional_field(
<<"components"/utf8>>,
none,
gleam@dynamic@decode:optional(
components_decoder()
),
fun(Components) ->
gleam@dynamic@decode:success(
{open_a_p_i,
Version,
Info,
Servers,
Paths,
Components}
)
end
)
end
)
end
)
end
)
end
).
-file("src/gilly/openapi/openapi.gleam", 54).
-spec from_json_string(binary()) -> {ok, open_a_p_i()} |
{error, gilly@openapi@error:error()}.
from_json_string(Json_string) ->
_pipe = gleam@json:parse(Json_string, openapi_decoder()),
gleam@result:map_error(_pipe, fun(E) -> case E of
{unable_to_decode, Errors} ->
handle_decode_errors(Errors);
_ ->
{json_error, E}
end end).