Packages
oaspec
0.54.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", 523).
?DOC(false).
-spec resolve_to_object(
oaspec@internal@openapi@schema:schema_ref(),
oaspec@internal@codegen@context:context()
) -> gleam@option:option(oaspec@internal@openapi@schema:schema_object()).
resolve_to_object(Ref, Ctx) ->
case Ref of
{inline, S} ->
{some, S};
{reference, _, _} ->
case oaspec@internal@codegen@context:resolve_schema_ref(Ref, Ctx) of
{ok, S@1} ->
{some, S@1};
{error, _} ->
none
end
end.
-file("src/oaspec/internal/codegen/client_ir.gleam", 538).
?DOC(false).
-spec option_or_none(
gleam@option:option(oaspec@internal@openapi@schema:schema_ref())
) -> oaspec@internal@openapi@schema:schema_ref().
option_or_none(Ref) ->
case Ref of
{some, R} ->
R;
none ->
{inline,
{object_schema,
oaspec@internal@openapi@schema:default_metadata(),
maps:new(),
[],
unspecified,
none,
none}}
end.
-file("src/oaspec/internal/codegen/client_ir.gleam", 480).
?DOC(false).
-spec multipart_has_optional_complex_field(
list({binary(),
oaspec@internal@openapi@spec:operation(oaspec@internal@openapi@spec:resolved()),
binary(),
oaspec@internal@openapi@spec:http_method()}),
oaspec@internal@codegen@context:context()
) -> boolean().
multipart_has_optional_complex_field(Operations, Ctx) ->
gleam@list:any(
Operations,
fun(Op) ->
{_, Operation, _, _} = Op,
case erlang:element(7, Operation) of
{some, {value, Rb}} ->
case gleam_stdlib:map_get(
erlang:element(3, Rb),
<<"multipart/form-data"/utf8>>
) of
{ok, Media_type} ->
case resolve_to_object(
option_or_none(erlang:element(2, Media_type)),
Ctx
) of
{some,
{object_schema,
_,
Properties,
Required,
_,
_,
_}} ->
_pipe = maps:to_list(Properties),
gleam@list:any(
_pipe,
fun(Entry) ->
{Name, Prop_ref} = Entry,
Is_optional = not gleam@list:contains(
Required,
Name
),
Is_optional andalso case resolve_to_object(
Prop_ref,
Ctx
) of
{some,
{array_schema,
_,
_,
_,
_,
_}} ->
true;
{some,
{object_schema,
_,
_,
_,
_,
_,
_}} ->
true;
_ ->
false
end
end
);
_ ->
false
end;
{error, _} ->
false
end;
_ ->
false
end
end
).
-file("src/oaspec/internal/codegen/client_ir.gleam", 513).
?DOC(false).
-spec multipart_object_props(
gleam@option:option(oaspec@internal@openapi@schema:schema_ref()),
oaspec@internal@codegen@context:context()
) -> list({binary(), oaspec@internal@openapi@schema:schema_ref()}).
multipart_object_props(Media_schema, Ctx) ->
case resolve_to_object(option_or_none(Media_schema), Ctx) of
{some, {object_schema, _, Properties, _, _, _, _}} ->
maps:to_list(Properties);
_ ->
[]
end.
-file("src/oaspec/internal/codegen/client_ir.gleam", 453).
?DOC(false).
-spec multipart_has_field(
list({binary(),
oaspec@internal@openapi@spec:operation(oaspec@internal@openapi@spec:resolved()),
binary(),
oaspec@internal@openapi@spec:http_method()}),
oaspec@internal@codegen@context:context(),
fun((oaspec@internal@openapi@schema:schema_object()) -> boolean())
) -> boolean().
multipart_has_field(Operations, Ctx, Pred) ->
gleam@list:any(
Operations,
fun(Op) ->
{_, Operation, _, _} = Op,
case erlang:element(7, Operation) of
{some, {value, Rb}} ->
case gleam_stdlib:map_get(
erlang:element(3, Rb),
<<"multipart/form-data"/utf8>>
) of
{ok, Media_type} ->
_pipe = multipart_object_props(
erlang:element(2, Media_type),
Ctx
),
gleam@list:any(
_pipe,
fun(Entry) ->
{_, Prop_ref} = Entry,
case resolve_to_object(Prop_ref, Ctx) of
{some, S} ->
Pred(S);
none ->
false
end
end
);
{error, _} ->
false
end;
_ ->
false
end
end
).
-file("src/oaspec/internal/codegen/client_ir.gleam", 554).
?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", 569).
?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", 633).
?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", 647).
?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", 38).
?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_multipart_array_field = multipart_has_field(
Operations,
Ctx,
fun(S) -> case S of
{array_schema, _, _, _, _, _} ->
true;
_ ->
false
end end
),
Has_multipart_object_field = multipart_has_field(
Operations,
Ctx,
fun(S@1) -> case S@1 of
{object_schema, _, _, _, _, _, _} ->
true;
_ ->
false
end end
),
Has_multipart_optional_complex_field = multipart_has_optional_complex_field(
Operations,
Ctx
),
Has_deep_object_param = gleam@list:any(
Operations,
fun(Op@4) ->
{_, Operation@4, _, _} = Op@4,
gleam@list:any(erlang:element(6, Operation@4), fun(Rp) -> case Rp of
{value, P@3} ->
oaspec@internal@codegen@operation_ir:is_deep_object_param(
P@3,
Ctx
);
_ ->
false
end end)
end
),
Has_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@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@6) ->
{_, Operation@6, _, _} = Op@6,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@6)),
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 Has_multipart_array_field)
orelse gleam@list:any(
All_params,
fun(P@4) -> erlang:element(3, P@4) =:= in_query end
))
orelse gleam@list:any(
All_params,
fun(P@5) -> erlang:element(3, P@5) =:= in_cookie end
))
orelse gleam@list:any(
All_params,
fun(P@6) -> erlang:element(3, P@6) =:= in_header end
))
orelse gleam@list:any(All_params, fun(P@7) -> case erlang:element(6, P@7) 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@7) ->
{_, Operation@7, _, _} = Op@7,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@7)),
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 Has_multipart_object_field) orelse gleam@list:any(
Operations,
fun(Op@8) ->
{_, Operation@8, _, _} = Op@8,
case erlang:element(7, Operation@8) 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@8) ->
(erlang:element(3, P@8) =:= in_path) orelse (erlang:element(3, P@8)
=:= 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))
orelse Has_multipart_optional_complex_field)
orelse Has_deep_object_param,
Needs_none_ctor = (((Needs_option_type orelse Has_optional_response_headers)
orelse any_operation_has_no_server(Ctx))
orelse Has_multipart_optional_complex_field)
orelse Has_deep_object_param,
Has_int_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@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@10) ->
{_, Operation@10, _, _} = Op@10,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@10)),
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@9) -> case erlang:element(6, P@9) 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@11) ->
{_, Operation@11, _, _} = Op@11,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@11)),
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@12) ->
{_, Operation@12, _, _} = Op@12,
gleam@list:any(
maps:to_list(erlang:element(8, Operation@12)),
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@10) ->
(erlang:element(3, P@10) =:= in_path) orelse (erlang:element(
3,
P@10
)
=:= in_cookie)
end
),
Needs_guards = oaspec@config:validate(
oaspec@internal@codegen@context:config(Ctx)
)
andalso gleam@list:any(
Operations,
fun(Op@13) ->
{_, Operation@13, _, _} = Op@13,
case erlang:element(7, Operation@13) 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}.