-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).