Packages
oaspec
0.53.0
0.68.0
0.67.0
0.66.0
0.65.0
0.64.0
0.63.0
0.62.0
0.61.0
0.60.0
0.59.0
0.58.1
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.3
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.1.3
Generate Gleam code from OpenAPI 3.x specifications
Current section
Files
Jump to
Current section
Files
src/oaspec@internal@codegen@client_ir.erl
-module(oaspec@internal@codegen@client_ir).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/oaspec/internal/codegen/client_ir.gleam").
-export([imports/2, analyze/1]).
-export_type([client_requirements/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.
?MODULEDOC(false).
-type client_requirements() :: {client_requirements,
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean(),
boolean()}.
-file("src/oaspec/internal/codegen/client_ir.gleam", 399).
?DOC(false).
-spec option_import(client_requirements()) -> gleam@option:option(binary()).
option_import(Requirements) ->
case {erlang:element(12, Requirements),
erlang:element(13, Requirements),
erlang:element(14, Requirements)} of
{true, _, _} ->
{some, <<"gleam/option.{type Option, None, Some}"/utf8>>};
{false, true, true} ->
{some, <<"gleam/option.{None, Some}"/utf8>>};
{false, true, false} ->
{some, <<"gleam/option.{Some}"/utf8>>};
{false, false, true} ->
{some, <<"gleam/option.{None}"/utf8>>};
{false, false, false} ->
none
end.
-file("src/oaspec/internal/codegen/client_ir.gleam", 414).
?DOC(false).
-spec imports(client_requirements(), oaspec@internal@codegen@context:context()) -> list(binary()).
imports(Requirements, Ctx) ->
Base_imports = [<<"gleam/result"/utf8>>,
<<"oaspec/transport"/utf8>>,
<<(oaspec@config:package(oaspec@internal@codegen@context:config(Ctx)))/binary,
"/decode"/utf8>>,
<<(oaspec@config:package(oaspec@internal@codegen@context:config(Ctx)))/binary,
"/response_types"/utf8>>],
Base_imports@1 = case erlang:element(15, Requirements) of
true ->
[<<"gleam/int"/utf8>> | Base_imports];
false ->
Base_imports
end,
Base_imports@2 = case option_import(Requirements) of
{some, Import_line} ->
[Import_line | Base_imports@1];
none ->
Base_imports@1
end,
Base_imports@3 = case erlang:element(11, Requirements) of
true ->
lists:append(
[<<(oaspec@config:package(
oaspec@internal@codegen@context:config(Ctx)
))/binary,
"/types"/utf8>>,
<<(oaspec@config:package(
oaspec@internal@codegen@context:config(Ctx)
))/binary,
"/encode"/utf8>>],
Base_imports@2
);
false ->
Base_imports@2
end,
Base_imports@4 = [<<(oaspec@config:package(
oaspec@internal@codegen@context:config(Ctx)
))/binary,
"/request_types"/utf8>> |
Base_imports@3],
Base_imports@5 = case erlang:element(10, Requirements) of
true ->
[<<"gleam/string"/utf8>> | Base_imports@4];
false ->
Base_imports@4
end,
Imports = case erlang:element(8, Requirements) of
true ->
[<<"gleam/dynamic/decode as dyn_decode"/utf8>> | Base_imports@5];
false ->
Base_imports@5
end,
Imports@1 = case erlang:element(9, Requirements) of
true ->
[<<"gleam/json"/utf8>> | Imports];
false ->
Imports
end,
Imports@2 = case erlang:element(2, Requirements) of
true ->
[<<"gleam/bool"/utf8>> | Imports@1];
false ->
Imports@1
end,
Imports@3 = case erlang:element(3, Requirements) of
true ->
[<<"gleam/float"/utf8>> | Imports@2];
false ->
Imports@2
end,
Imports@4 = case erlang:element(7, Requirements) of
true ->
[<<"gleam/list"/utf8>> | Imports@3];
false ->
Imports@3
end,
Imports@5 = case erlang:element(18, Requirements) of
true ->
[<<"gleam/uri"/utf8>> | Imports@4];
false ->
Imports@4
end,
case erlang:element(19, Requirements) of
true ->
[<<(oaspec@config:package(
oaspec@internal@codegen@context:config(Ctx)
))/binary,
"/guards"/utf8>> |
Imports@5];
false ->
Imports@5
end.
-file("src/oaspec/internal/codegen/client_ir.gleam", 478).
?DOC(false).
-spec any_operation_has_server(oaspec@internal@codegen@context:context()) -> boolean().
any_operation_has_server(Ctx) ->
gleam@list:any(
oaspec@internal@codegen@context:operations(Ctx),
fun(Op) ->
{_, Operation, _, _} = Op,
case erlang:element(12, Operation) of
[] ->
case erlang:element(
6,
oaspec@internal@codegen@context:spec(Ctx)
) of
[] ->
false;
_ ->
true
end;
_ ->
true
end
end
).
-file("src/oaspec/internal/codegen/client_ir.gleam", 492).
?DOC(false).
-spec any_operation_has_no_server(oaspec@internal@codegen@context:context()) -> boolean().
any_operation_has_no_server(Ctx) ->
gleam@list:any(
oaspec@internal@codegen@context:operations(Ctx),
fun(Op) ->
{_, Operation, _, _} = Op,
case erlang:element(12, Operation) of
[] ->
case erlang:element(
6,
oaspec@internal@codegen@context:spec(Ctx)
) of
[] ->
true;
_ ->
false
end;
_ ->
false
end
end
).
-file("src/oaspec/internal/codegen/client_ir.gleam", 37).
?DOC(false).
-spec analyze(oaspec@internal@codegen@context:context()) -> client_requirements().
analyze(Ctx) ->
Operations = oaspec@internal@codegen@context:operations(Ctx),
All_params = gleam@list:flat_map(
Operations,
fun(Op) ->
{_, Operation, _, _} = Op,
gleam@list:filter_map(
erlang:element(6, Operation),
fun(Ref_p) -> case Ref_p of
{value, P} ->
{ok, P};
_ ->
{error, nil}
end end
)
end
),
Needs_bool = gleam@list:any(
All_params,
fun(P@1) -> case erlang:element(6, P@1) of
{parameter_schema, {inline, {boolean_schema, _}}} ->
true;
_ ->
false
end end
),
Needs_float_param = gleam@list:any(
All_params,
fun(P@2) -> case erlang:element(6, P@2) of
{parameter_schema,
{inline, {number_schema, _, _, _, _, _, _, _}}} ->
true;
_ ->
false
end end
),
Has_multi_content_response = gleam@list:any(
Operations,
fun(Op@1) ->
{_, Operation@1, _, _} = Op@1,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@1)),
fun(Entry) ->
{_, Ref_or} = Entry,
case Ref_or of
{value, Response} ->
erlang:length(
maps:to_list(erlang:element(3, Response))
)
> 1;
_ ->
false
end
end
)
end
),
Has_form_urlencoded = gleam@list:any(
Operations,
fun(Op@2) ->
{_, Operation@2, _, _} = Op@2,
case erlang:element(7, Operation@2) of
{some, {value, Rb}} ->
gleam@list:any(
maps:to_list(erlang:element(3, Rb)),
fun(Ce) ->
{Key, _} = Ce,
Key =:= <<"application/x-www-form-urlencoded"/utf8>>
end
);
_ ->
false
end
end
),
Has_multipart = gleam@list:any(
Operations,
fun(Op@3) ->
{_, Operation@3, _, _} = Op@3,
case erlang:element(7, Operation@3) of
{some, {value, Rb@1}} ->
gleam@list:any(
maps:to_list(erlang:element(3, Rb@1)),
fun(Ce@1) ->
{Key@1, _} = Ce@1,
Key@1 =:= <<"multipart/form-data"/utf8>>
end
);
_ ->
false
end
end
),
Has_response_headers = gleam@list:any(
Operations,
fun(Op@4) ->
{_, Operation@4, _, _} = Op@4,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@4)),
fun(Entry@1) ->
{_, Ref_or@1} = Entry@1,
case Ref_or@1 of
{value, Response@1} ->
maps:size(erlang:element(4, Response@1)) > 0;
_ ->
false
end
end
)
end
),
Has_optional_response_headers = gleam@list:any(
Operations,
fun(Op@5) ->
{_, Operation@5, _, _} = Op@5,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@5)),
fun(Entry@2) ->
{_, Ref_or@2} = Entry@2,
case Ref_or@2 of
{value, Response@2} ->
gleam@list:any(
maps:to_list(erlang:element(4, Response@2)),
fun(H_entry) ->
{_, Header} = H_entry,
not erlang:element(3, Header)
end
);
_ ->
false
end
end
)
end
),
Needs_list = (((((Has_form_urlencoded orelse Has_multi_content_response)
orelse Has_response_headers)
orelse gleam@list:any(
All_params,
fun(P@3) -> erlang:element(3, P@3) =:= in_query end
))
orelse gleam@list:any(
All_params,
fun(P@4) -> erlang:element(3, P@4) =:= in_cookie end
))
orelse gleam@list:any(
All_params,
fun(P@5) -> erlang:element(3, P@5) =:= in_header end
))
orelse gleam@list:any(All_params, fun(P@6) -> case erlang:element(6, P@6) of
{parameter_schema, {inline, {array_schema, _, _, _, _, _}}} ->
true;
{parameter_schema, {reference, _, _} = Sr} ->
case oaspec@internal@codegen@context:resolve_schema_ref(
Sr,
Ctx
) of
{ok, {array_schema, _, _, _, _, _}} ->
true;
_ ->
false
end;
_ ->
false
end end),
Needs_dyn_decode = gleam@list:any(
Operations,
fun(Op@6) ->
{_, Operation@6, _, _} = Op@6,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@6)),
fun(Entry@3) ->
{_, Ref_or@3} = Entry@3,
case Ref_or@3 of
{value, Response@3} ->
gleam@list:any(
maps:to_list(erlang:element(3, Response@3)),
fun(Ce@2) ->
{Media_type_name, Mt} = Ce@2,
case oaspec@internal@util@content_type:from_string(
Media_type_name
) of
text_plain ->
false;
application_octet_stream ->
false;
wildcard ->
false;
_ ->
case erlang:element(2, Mt) of
{some,
{inline,
{array_schema,
_,
_,
_,
_,
_}}} ->
true;
{some,
{inline,
{string_schema,
_,
_,
_,
_,
_,
_}}} ->
true;
{some,
{inline,
{integer_schema,
_,
_,
_,
_,
_,
_,
_}}} ->
true;
{some,
{inline,
{number_schema,
_,
_,
_,
_,
_,
_,
_}}} ->
true;
{some,
{inline,
{boolean_schema, _}}} ->
true;
_ ->
false
end
end
end
);
_ ->
false
end
end
)
end
),
Needs_json = Needs_dyn_decode orelse gleam@list:any(
Operations,
fun(Op@7) ->
{_, Operation@7, _, _} = Op@7,
case erlang:element(7, Operation@7) of
{some, {value, Rb@2}} ->
gleam@list:any(
maps:to_list(erlang:element(3, Rb@2)),
fun(Ce@3) ->
{Ct_name, Mt@1} = Ce@3,
case oaspec@internal@util@content_type:from_string(
Ct_name
) of
application_octet_stream ->
false;
wildcard ->
false;
_ ->
case erlang:element(2, Mt@1) of
{some,
{inline,
{string_schema,
_,
_,
_,
_,
_,
_}}} ->
true;
{some,
{inline,
{integer_schema,
_,
_,
_,
_,
_,
_,
_}}} ->
true;
{some,
{inline,
{number_schema,
_,
_,
_,
_,
_,
_,
_}}} ->
true;
{some, {inline, {boolean_schema, _}}} ->
true;
_ ->
false
end
end
end
);
_ ->
false
end
end
),
Needs_string = ((Has_multi_content_response orelse Has_form_urlencoded)
orelse Has_multipart)
orelse gleam@list:any(
All_params,
fun(P@7) ->
(erlang:element(3, P@7) =:= in_path) orelse (erlang:element(3, P@7)
=:= in_cookie)
end
),
Needs_typed_schemas = oaspec@internal@codegen@import_analysis:operations_need_typed_schemas(
Operations
),
Needs_option_type = oaspec@internal@codegen@import_analysis:operations_have_optional_params(
Operations
)
orelse oaspec@internal@codegen@import_analysis:operations_have_optional_body(
Operations
),
Needs_some_ctor = (Needs_option_type orelse Has_optional_response_headers)
orelse any_operation_has_server(Ctx),
Needs_none_ctor = (Needs_option_type orelse Has_optional_response_headers)
orelse any_operation_has_no_server(Ctx),
Has_int_response_header = gleam@list:any(
Operations,
fun(Op@8) ->
{_, Operation@8, _, _} = Op@8,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@8)),
fun(Entry@4) ->
{_, Ref_or@4} = Entry@4,
case Ref_or@4 of
{value, Response@4} ->
gleam@list:any(
maps:to_list(erlang:element(4, Response@4)),
fun(H_entry@1) ->
{_, Header@1} = H_entry@1,
case erlang:element(4, Header@1) of
{some,
{inline,
{integer_schema,
_,
_,
_,
_,
_,
_,
_}}} ->
true;
_ ->
false
end
end
);
_ ->
false
end
end
)
end
),
Has_float_response_header = gleam@list:any(
Operations,
fun(Op@9) ->
{_, Operation@9, _, _} = Op@9,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@9)),
fun(Entry@5) ->
{_, Ref_or@5} = Entry@5,
case Ref_or@5 of
{value, Response@5} ->
gleam@list:any(
maps:to_list(erlang:element(4, Response@5)),
fun(H_entry@2) ->
{_, Header@2} = H_entry@2,
case erlang:element(4, Header@2) of
{some,
{inline,
{number_schema,
_,
_,
_,
_,
_,
_,
_}}} ->
true;
_ ->
false
end
end
);
_ ->
false
end
end
)
end
),
Needs_int = Has_int_response_header orelse gleam@list:any(
All_params,
fun(P@8) -> case erlang:element(6, P@8) of
{parameter_schema,
{inline, {integer_schema, _, _, _, _, _, _, _}}} ->
true;
{parameter_schema,
{inline,
{array_schema,
_,
{inline, {integer_schema, _, _, _, _, _, _, _}},
_,
_,
_}}} ->
true;
{parameter_schema, {reference, _, _} = Sr@1} ->
case oaspec@internal@codegen@context:resolve_schema_ref(
Sr@1,
Ctx
) of
{ok, {integer_schema, _, _, _, _, _, _, _}} ->
true;
{ok,
{array_schema,
_,
{inline, {integer_schema, _, _, _, _, _, _, _}},
_,
_,
_}} ->
true;
_ ->
false
end;
_ ->
false
end end
),
Needs_float = Needs_float_param orelse Has_float_response_header,
Needs_bytes_helper = gleam@list:any(
Operations,
fun(Op@10) ->
{_, Operation@10, _, _} = Op@10,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@10)),
fun(Entry@6) ->
{_, Ref_or@6} = Entry@6,
case Ref_or@6 of
{value, Response@6} ->
gleam@list:any(
maps:to_list(erlang:element(3, Response@6)),
fun(Ce@4) ->
{Name, _} = Ce@4,
case oaspec@internal@util@content_type:from_string(
Name
) of
application_octet_stream ->
true;
wildcard ->
true;
_ ->
false
end
end
);
_ ->
false
end
end
)
end
),
Needs_text_helper = gleam@list:any(
Operations,
fun(Op@11) ->
{_, Operation@11, _, _} = Op@11,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@11)),
fun(Entry@7) ->
{_, Ref_or@7} = Entry@7,
case Ref_or@7 of
{value, Response@7} ->
gleam@list:any(
maps:to_list(erlang:element(3, Response@7)),
fun(Ce@5) ->
{_, Mt@2} = Ce@5,
case erlang:element(2, Mt@2) of
{some, _} ->
true;
none ->
false
end
end
);
_ ->
false
end
end
)
end
),
Needs_uri = Has_form_urlencoded orelse gleam@list:any(
All_params,
fun(P@9) ->
(erlang:element(3, P@9) =:= in_path) orelse (erlang:element(3, P@9)
=:= in_cookie)
end
),
Needs_guards = oaspec@config:validate(
oaspec@internal@codegen@context:config(Ctx)
)
andalso gleam@list:any(
Operations,
fun(Op@12) ->
{_, Operation@12, _, _} = Op@12,
case erlang:element(7, Operation@12) of
{some, {value, Rb@3}} ->
Content_entries = maps:to_list(erlang:element(3, Rb@3)),
case Content_entries of
[{_, Mt@3}] ->
case erlang:element(2, Mt@3) of
{some, {reference, _, Name@1}} ->
oaspec@internal@codegen@guards:schema_has_validator(
Name@1,
Ctx
);
_ ->
false
end;
_ ->
false
end;
_ ->
false
end
end
),
{client_requirements,
Needs_bool,
Needs_float,
Has_multi_content_response,
Has_form_urlencoded,
Has_multipart,
Needs_list,
Needs_dyn_decode,
Needs_json,
Needs_string,
Needs_typed_schemas,
Needs_option_type,
Needs_some_ctor,
Needs_none_ctor,
Needs_int,
Needs_bytes_helper,
Needs_text_helper,
Needs_uri,
Needs_guards}.