Packages
oaspec
0.62.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.erl
-module(oaspec@internal@codegen@client).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/oaspec/internal/codegen/client.gleam").
-export([generate/1]).
-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).
-file("src/oaspec/internal/codegen/client.gleam", 101).
?DOC(false).
-spec substitute_server_variables(
binary(),
list({binary(), oaspec@internal@openapi@spec:server_variable()})
) -> binary().
substitute_server_variables(Url, Variables) ->
gleam@list:fold(
Variables,
Url,
fun(Acc, Entry) ->
{Name, Variable} = Entry,
gleam@string:replace(
Acc,
<<<<"{"/utf8, Name/binary>>/binary, "}"/utf8>>,
erlang:element(2, Variable)
)
end
).
-file("src/oaspec/internal/codegen/client.gleam", 112).
?DOC(false).
-spec generate_default_base_url(
gleam@string_tree:string_tree(),
oaspec@internal@codegen@context:context()
) -> gleam@string_tree:string_tree().
generate_default_base_url(Sb, Ctx) ->
case erlang:element(6, oaspec@internal@codegen@context:spec(Ctx)) of
[First_server | _] ->
Variables = oaspec@internal@codegen@ir_build:sorted_entries(
erlang:element(4, First_server)
),
Resolved_url = substitute_server_variables(
erlang:element(2, First_server),
Variables
),
Defaults_doc = case Variables of
[] ->
<<""/utf8>>;
_ ->
<<"Defaults: "/utf8,
(gleam@string:join(
gleam@list:map(
Variables,
fun(Entry) ->
{Name, Variable} = Entry,
<<<<<<Name/binary, " = \""/utf8>>/binary,
(erlang:element(2, Variable))/binary>>/binary,
"\""/utf8>>
end
),
<<", "/utf8>>
))/binary>>
end,
Sb@1 = case Defaults_doc of
<<""/utf8>> ->
_pipe = Sb,
oaspec@internal@util@string_extra:doc_comment(
_pipe,
<<"Default base URL declared by the OpenAPI spec."/utf8>>
);
Doc ->
_pipe@1 = Sb,
_pipe@2 = oaspec@internal@util@string_extra:doc_comment(
_pipe@1,
<<"Default base URL declared by the OpenAPI spec."/utf8>>
),
oaspec@internal@util@string_extra:doc_comment(_pipe@2, Doc)
end,
_pipe@3 = Sb@1,
_pipe@4 = oaspec@internal@util@string_extra:line(
_pipe@3,
<<"pub fn default_base_url() -> String {"/utf8>>
),
_pipe@5 = oaspec@internal@util@string_extra:indent(
_pipe@4,
1,
<<<<"\""/utf8, Resolved_url/binary>>/binary, "\""/utf8>>
),
_pipe@6 = oaspec@internal@util@string_extra:line(
_pipe@5,
<<"}"/utf8>>
),
oaspec@internal@util@string_extra:blank_line(_pipe@6);
[] ->
Sb
end.
-file("src/oaspec/internal/codegen/client.gleam", 154).
?DOC(false).
-spec generate_text_body_helper(gleam@string_tree:string_tree()) -> gleam@string_tree:string_tree().
generate_text_body_helper(Sb) ->
oaspec@internal@util@string_extra:raw(
Sb,
<<"fn text_body(body: transport.Body) -> Result(String, ClientError) {
case body {
transport.TextBody(text) -> Ok(text)
transport.BytesBody(_) -> Error(InvalidResponse(detail: \"expected text body, got bytes\"))
transport.EmptyBody -> Error(InvalidResponse(detail: \"expected text body, got empty body\"))
}
}
"/utf8>>
).
-file("src/oaspec/internal/codegen/client.gleam", 159).
?DOC(false).
-spec generate_bytes_body_helper(gleam@string_tree:string_tree()) -> gleam@string_tree:string_tree().
generate_bytes_body_helper(Sb) ->
oaspec@internal@util@string_extra:raw(
Sb,
<<"fn bytes_body(body: transport.Body) -> Result(BitArray, ClientError) {
case body {
transport.BytesBody(bytes) -> Ok(bytes)
transport.TextBody(_) -> Error(InvalidResponse(detail: \"expected binary body, got text\"))
transport.EmptyBody -> Error(InvalidResponse(detail: \"expected binary body, got empty body\"))
}
}
"/utf8>>
).
-file("src/oaspec/internal/codegen/client.gleam", 165).
?DOC(false).
-spec generate_async_response_helper(gleam@string_tree:string_tree()) -> gleam@string_tree:string_tree().
generate_async_response_helper(Sb) ->
oaspec@internal@util@string_extra:raw(
Sb,
<<"fn await_response(
response_async: transport.Async(Result(transport.Response, transport.TransportError)),
decode: fn(transport.Response) -> Result(a, ClientError),
) -> transport.Async(Result(a, ClientError)) {
response_async
|> transport.map(fn(resp_result) {
resp_result |> result.map_error(TransportError)
})
|> transport.map_try(decode)
}
"/utf8>>
).
-file("src/oaspec/internal/codegen/client.gleam", 247).
?DOC(false).
-spec resolve_param_schema(
oaspec@internal@openapi@schema:schema_ref(),
oaspec@internal@codegen@context:context()
) -> gleam@option:option(oaspec@internal@openapi@schema:schema_object()).
resolve_param_schema(Schema_ref, Ctx) ->
case Schema_ref of
{inline, Obj} ->
{some, Obj};
{reference, _, _} ->
case oaspec@internal@codegen@context:resolve_schema_ref(
Schema_ref,
Ctx
) of
{ok, Obj@1} ->
{some, Obj@1};
{error, _} ->
none
end
end.
-file("src/oaspec/internal/codegen/client.gleam", 230).
?DOC(false).
-spec deep_object_properties_and_required(
oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved()),
oaspec@internal@codegen@context:context()
) -> {list({binary(), oaspec@internal@openapi@schema:schema_ref()}),
list(binary())}.
deep_object_properties_and_required(P, Ctx) ->
case oaspec@internal@openapi@spec:parameter_schema(P) of
{some, Schema_ref} ->
case resolve_param_schema(Schema_ref, Ctx) of
{some, {object_schema, _, Properties, Required, _, _, _}} ->
{oaspec@internal@codegen@ir_build:sorted_entries(Properties),
Required};
_ ->
{[], []}
end;
none ->
{[], []}
end.
-file("src/oaspec/internal/codegen/client.gleam", 267).
?DOC(false).
-spec items_resolve_to_primitive(
oaspec@internal@openapi@schema:schema_ref(),
oaspec@internal@codegen@context:context()
) -> boolean().
items_resolve_to_primitive(Items, Ctx) ->
case resolve_param_schema(Items, Ctx) of
{some, {string_schema, _, _, _, _, _, _}} ->
true;
{some, {integer_schema, _, _, _, _, _, _, _}} ->
true;
{some, {number_schema, _, _, _, _, _, _, _}} ->
true;
{some, {boolean_schema, _}} ->
true;
_ ->
false
end.
-file("src/oaspec/internal/codegen/client.gleam", 355).
?DOC(false).
-spec emit_deep_object_json_array_property(
gleam@string_tree:string_tree(),
binary(),
binary(),
oaspec@internal@openapi@schema:schema_ref(),
boolean()
) -> gleam@string_tree:string_tree().
emit_deep_object_json_array_property(Sb, Key, Field_access, Items, Is_required) ->
Item_encoder = case Items of
{reference, _, Name} ->
<<<<"encode.encode_"/utf8,
(oaspec@internal@util@naming:to_snake_case(Name))/binary>>/binary,
"_json"/utf8>>;
_ ->
oaspec@internal@codegen@schema_dispatch:json_encoder_fn(Items)
end,
Value_expr = <<<<"json.to_string(json.array(v_inner, "/utf8,
Item_encoder/binary>>/binary,
"))"/utf8>>,
case Is_required of
true ->
_pipe = Sb,
_pipe@1 = oaspec@internal@util@string_extra:indent(
_pipe,
1,
<<"let query = {"/utf8>>
),
_pipe@2 = oaspec@internal@util@string_extra:indent(
_pipe@1,
2,
<<"let v_inner = "/utf8, Field_access/binary>>
),
_pipe@3 = oaspec@internal@util@string_extra:indent(
_pipe@2,
2,
<<<<<<<<"[#(\""/utf8, Key/binary>>/binary, "\", "/utf8>>/binary,
Value_expr/binary>>/binary,
"), ..query]"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@3, 1, <<"}"/utf8>>);
false ->
_pipe@4 = Sb,
_pipe@5 = oaspec@internal@util@string_extra:indent(
_pipe@4,
1,
<<<<"let query = case "/utf8, Field_access/binary>>/binary,
" {"/utf8>>
),
_pipe@6 = oaspec@internal@util@string_extra:indent(
_pipe@5,
2,
<<<<<<<<"Some(v_inner) -> [#(\""/utf8, Key/binary>>/binary,
"\", "/utf8>>/binary,
Value_expr/binary>>/binary,
"), ..query]"/utf8>>
),
_pipe@7 = oaspec@internal@util@string_extra:indent(
_pipe@6,
2,
<<"None -> query"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@7, 1, <<"}"/utf8>>)
end.
-file("src/oaspec/internal/codegen/client.gleam", 387).
?DOC(false).
-spec emit_deep_object_json_property(
gleam@string_tree:string_tree(),
binary(),
binary(),
oaspec@internal@openapi@schema:schema_ref(),
boolean()
) -> gleam@string_tree:string_tree().
emit_deep_object_json_property(Sb, Key, Field_access, Prop_ref, Is_required) ->
Inner = case Prop_ref of
{reference, _, Name} ->
<<<<"encode.encode_"/utf8,
(oaspec@internal@util@naming:to_snake_case(Name))/binary>>/binary,
"_json(v_inner)"/utf8>>;
_ ->
oaspec@internal@codegen@schema_dispatch:json_encoder_expr(
Prop_ref,
<<"v_inner"/utf8>>
)
end,
Value_expr = <<<<"json.to_string("/utf8, Inner/binary>>/binary, ")"/utf8>>,
case Is_required of
true ->
_pipe = Sb,
_pipe@1 = oaspec@internal@util@string_extra:indent(
_pipe,
1,
<<"let query = {"/utf8>>
),
_pipe@2 = oaspec@internal@util@string_extra:indent(
_pipe@1,
2,
<<"let v_inner = "/utf8, Field_access/binary>>
),
_pipe@3 = oaspec@internal@util@string_extra:indent(
_pipe@2,
2,
<<<<<<<<"[#(\""/utf8, Key/binary>>/binary, "\", "/utf8>>/binary,
Value_expr/binary>>/binary,
"), ..query]"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@3, 1, <<"}"/utf8>>);
false ->
_pipe@4 = Sb,
_pipe@5 = oaspec@internal@util@string_extra:indent(
_pipe@4,
1,
<<<<"let query = case "/utf8, Field_access/binary>>/binary,
" {"/utf8>>
),
_pipe@6 = oaspec@internal@util@string_extra:indent(
_pipe@5,
2,
<<<<<<<<"Some(v_inner) -> [#(\""/utf8, Key/binary>>/binary,
"\", "/utf8>>/binary,
Value_expr/binary>>/binary,
"), ..query]"/utf8>>
),
_pipe@7 = oaspec@internal@util@string_extra:indent(
_pipe@6,
2,
<<"None -> query"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@7, 1, <<"}"/utf8>>)
end.
-file("src/oaspec/internal/codegen/client.gleam", 467).
?DOC(false).
-spec emit_deep_object_primitive_inner(
gleam@string_tree:string_tree(),
binary(),
binary(),
oaspec@internal@openapi@schema:schema_ref(),
boolean(),
binary(),
binary(),
oaspec@internal@codegen@context:context()
) -> gleam@string_tree:string_tree().
emit_deep_object_primitive_inner(
Sb,
Key,
Field_access,
Prop_ref,
Is_required,
Prop_name,
Parent_path,
Ctx
) ->
Value_expr = case Prop_ref of
{inline, {string_schema, _, _, Enum_values, _, _, _}} when Enum_values =/= [] ->
Enum_type = oaspec@internal@codegen@ir_build:inline_enum_type_name_for(
Parent_path,
Prop_name,
Ctx
),
<<<<"encode.encode_"/utf8,
(oaspec@internal@util@naming:to_snake_case(Enum_type))/binary>>/binary,
"_to_string(v_inner)"/utf8>>;
_ ->
oaspec@internal@codegen@schema_dispatch:schema_ref_to_string_expr(
Prop_ref,
<<"v_inner"/utf8>>,
Ctx
)
end,
case Is_required of
true ->
_pipe = Sb,
_pipe@1 = oaspec@internal@util@string_extra:indent(
_pipe,
1,
<<"let query = {"/utf8>>
),
_pipe@2 = oaspec@internal@util@string_extra:indent(
_pipe@1,
2,
<<"let v_inner = "/utf8, Field_access/binary>>
),
_pipe@3 = oaspec@internal@util@string_extra:indent(
_pipe@2,
2,
<<<<<<<<"[#(\""/utf8, Key/binary>>/binary, "\", "/utf8>>/binary,
Value_expr/binary>>/binary,
"), ..query]"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@3, 1, <<"}"/utf8>>);
false ->
_pipe@4 = Sb,
_pipe@5 = oaspec@internal@util@string_extra:indent(
_pipe@4,
1,
<<<<"let query = case "/utf8, Field_access/binary>>/binary,
" {"/utf8>>
),
_pipe@6 = oaspec@internal@util@string_extra:indent(
_pipe@5,
2,
<<<<<<<<"Some(v_inner) -> [#(\""/utf8, Key/binary>>/binary,
"\", "/utf8>>/binary,
Value_expr/binary>>/binary,
"), ..query]"/utf8>>
),
_pipe@7 = oaspec@internal@util@string_extra:indent(
_pipe@6,
2,
<<"None -> query"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@7, 1, <<"}"/utf8>>)
end.
-file("src/oaspec/internal/codegen/client.gleam", 419).
?DOC(false).
-spec emit_deep_object_primitive(
gleam@string_tree:string_tree(),
binary(),
binary(),
oaspec@internal@openapi@schema:schema_ref(),
boolean(),
binary(),
binary(),
oaspec@internal@codegen@context:context()
) -> gleam@string_tree:string_tree().
emit_deep_object_primitive(
Sb,
Key,
Field_access,
Prop_ref,
Is_required,
Prop_name,
Parent_path,
Ctx
) ->
Array_with_complex_items = case resolve_param_schema(Prop_ref, Ctx) of
{some, {array_schema, _, Items, _, _, _}} ->
case items_resolve_to_primitive(Items, Ctx) of
true ->
none;
false ->
{some, Items}
end;
_ ->
none
end,
case Array_with_complex_items of
{some, Items@1} ->
emit_deep_object_json_array_property(
Sb,
Key,
Field_access,
Items@1,
Is_required
);
none ->
emit_deep_object_primitive_inner(
Sb,
Key,
Field_access,
Prop_ref,
Is_required,
Prop_name,
Parent_path,
Ctx
)
end.
-file("src/oaspec/internal/codegen/client.gleam", 510).
?DOC(false).
-spec emit_deep_object_nested_object(
gleam@string_tree:string_tree(),
binary(),
binary(),
gleam@dict:dict(binary(), oaspec@internal@openapi@schema:schema_ref()),
boolean(),
binary(),
binary(),
oaspec@internal@codegen@context:context()
) -> gleam@string_tree:string_tree().
emit_deep_object_nested_object(
Sb,
Outer_key,
Outer_access,
Inner_props,
Outer_is_required,
Outer_prop_name,
Parent_path,
Ctx
) ->
Entries = oaspec@internal@codegen@ir_build:sorted_entries(Inner_props),
Inner_parent = <<<<Parent_path/binary, "_"/utf8>>/binary,
(oaspec@internal@util@naming:to_snake_case(Outer_prop_name))/binary>>,
Inner_emit = fun(Sb@1, Scope_access) ->
gleam@list:fold(
Entries,
Sb@1,
fun(Sb@2, Entry) ->
{Inner_name, Inner_ref} = Entry,
Gleam_field = oaspec@internal@util@naming:to_snake_case(
Inner_name
),
Field_access = <<<<Scope_access/binary, "."/utf8>>/binary,
Gleam_field/binary>>,
Key = <<<<<<Outer_key/binary, "["/utf8>>/binary,
Inner_name/binary>>/binary,
"]"/utf8>>,
emit_deep_object_primitive(
Sb@2,
Key,
Field_access,
Inner_ref,
false,
Inner_name,
Inner_parent,
Ctx
)
end
)
end,
case Outer_is_required of
true ->
Inner_emit(Sb, Outer_access);
false ->
_pipe = Sb,
_pipe@1 = oaspec@internal@util@string_extra:indent(
_pipe,
1,
<<<<"let query = case "/utf8, Outer_access/binary>>/binary,
" {"/utf8>>
),
_pipe@2 = oaspec@internal@util@string_extra:indent(
_pipe@1,
2,
<<"Some(v_outer) -> {"/utf8>>
),
_pipe@3 = Inner_emit(_pipe@2, <<"v_outer"/utf8>>),
_pipe@4 = oaspec@internal@util@string_extra:indent(
_pipe@3,
2,
<<" query"/utf8>>
),
_pipe@5 = oaspec@internal@util@string_extra:indent(
_pipe@4,
2,
<<"}"/utf8>>
),
_pipe@6 = oaspec@internal@util@string_extra:indent(
_pipe@5,
2,
<<"None -> query"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@6, 1, <<"}"/utf8>>)
end.
-file("src/oaspec/internal/codegen/client.gleam", 277).
?DOC(false).
-spec emit_deep_object_property(
gleam@string_tree:string_tree(),
binary(),
binary(),
oaspec@internal@openapi@schema:schema_ref(),
boolean(),
binary(),
binary(),
oaspec@internal@codegen@context:context()
) -> gleam@string_tree:string_tree().
emit_deep_object_property(
Sb,
Key,
Field_access,
Prop_ref,
Is_required_prop,
Prop_name,
Parent_path,
Ctx
) ->
case resolve_param_schema(Prop_ref, Ctx) of
{some, {object_schema, _, Inner_props, _, _, _, _}} ->
emit_deep_object_nested_object(
Sb,
Key,
Field_access,
Inner_props,
Is_required_prop,
Prop_name,
Parent_path,
Ctx
);
{some, {one_of_schema, _, _, _}} ->
emit_deep_object_json_property(
Sb,
Key,
Field_access,
Prop_ref,
Is_required_prop
);
{some, {any_of_schema, _, _, _}} ->
emit_deep_object_json_property(
Sb,
Key,
Field_access,
Prop_ref,
Is_required_prop
);
{some, {all_of_schema, _, _}} ->
emit_deep_object_json_property(
Sb,
Key,
Field_access,
Prop_ref,
Is_required_prop
);
{some, {array_schema, _, Items, _, _, _}} ->
case items_resolve_to_primitive(Items, Ctx) of
true ->
emit_deep_object_primitive(
Sb,
Key,
Field_access,
Prop_ref,
Is_required_prop,
Prop_name,
Parent_path,
Ctx
);
false ->
emit_deep_object_json_array_property(
Sb,
Key,
Field_access,
Items,
Is_required_prop
)
end;
{some, _} ->
emit_deep_object_primitive(
Sb,
Key,
Field_access,
Prop_ref,
Is_required_prop,
Prop_name,
Parent_path,
Ctx
);
none ->
emit_deep_object_primitive(
Sb,
Key,
Field_access,
Prop_ref,
Is_required_prop,
Prop_name,
Parent_path,
Ctx
)
end.
-file("src/oaspec/internal/codegen/client.gleam", 174).
?DOC(false).
-spec emit_deep_object_query_param(
gleam@string_tree:string_tree(),
oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved()),
binary(),
binary(),
oaspec@internal@codegen@context:context()
) -> gleam@string_tree:string_tree().
emit_deep_object_query_param(Sb, P, Param_name, Op_id, Ctx) ->
{Outer_props, Required_set} = deep_object_properties_and_required(P, Ctx),
Access_outer = case erlang:element(5, P) of
true ->
Param_name;
false ->
<<"v"/utf8>>
end,
Parent_path = <<<<(oaspec@internal@util@naming:to_snake_case(Op_id))/binary,
"_param_"/utf8>>/binary,
(oaspec@internal@util@naming:to_snake_case(erlang:element(2, P)))/binary>>,
Inner_emit = fun(Sb@1) ->
gleam@list:fold(
Outer_props,
Sb@1,
fun(Sb@2, Prop) ->
{Prop_name, Prop_ref} = Prop,
Gleam_field = oaspec@internal@util@naming:to_snake_case(
Prop_name
),
Field_access = <<<<Access_outer/binary, "."/utf8>>/binary,
Gleam_field/binary>>,
Key = <<<<<<(erlang:element(2, P))/binary, "["/utf8>>/binary,
Prop_name/binary>>/binary,
"]"/utf8>>,
Is_required = gleam@list:contains(Required_set, Prop_name),
emit_deep_object_property(
Sb@2,
Key,
Field_access,
Prop_ref,
Is_required,
Prop_name,
Parent_path,
Ctx
)
end
)
end,
case erlang:element(5, P) of
true ->
Inner_emit(Sb);
false ->
_pipe = Sb,
_pipe@1 = oaspec@internal@util@string_extra:indent(
_pipe,
1,
<<<<"let query = case "/utf8, Param_name/binary>>/binary,
" {"/utf8>>
),
_pipe@2 = oaspec@internal@util@string_extra:indent(
_pipe@1,
2,
<<"Some(v) -> {"/utf8>>
),
_pipe@3 = Inner_emit(_pipe@2),
_pipe@4 = oaspec@internal@util@string_extra:indent(
_pipe@3,
2,
<<" query"/utf8>>
),
_pipe@5 = oaspec@internal@util@string_extra:indent(
_pipe@4,
2,
<<"}"/utf8>>
),
_pipe@6 = oaspec@internal@util@string_extra:indent(
_pipe@5,
2,
<<"None -> query"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@6, 1, <<"}"/utf8>>)
end.
-file("src/oaspec/internal/codegen/client.gleam", 565).
?DOC(false).
-spec emit_simple_query_param(
gleam@string_tree:string_tree(),
oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved()),
binary(),
oaspec@internal@codegen@context:context()
) -> gleam@string_tree:string_tree().
emit_simple_query_param(Sb, P, Param_name, Ctx) ->
case erlang:element(5, P) of
true ->
To_str = oaspec@internal@codegen@client_request:param_to_string_expr(
P,
Param_name,
Ctx
),
_pipe = Sb,
oaspec@internal@util@string_extra:indent(
_pipe,
1,
<<<<<<<<"let query = [#(\""/utf8,
(erlang:element(2, P))/binary>>/binary,
"\", "/utf8>>/binary,
To_str/binary>>/binary,
"), ..query]"/utf8>>
);
false ->
To_str@1 = oaspec@internal@codegen@client_request:to_str_for_optional_value(
P,
Ctx
),
_pipe@1 = Sb,
_pipe@2 = oaspec@internal@util@string_extra:indent(
_pipe@1,
1,
<<<<"let query = case "/utf8, Param_name/binary>>/binary,
" {"/utf8>>
),
_pipe@3 = oaspec@internal@util@string_extra:indent(
_pipe@2,
2,
<<<<<<<<"Some(v) -> [#(\""/utf8, (erlang:element(2, P))/binary>>/binary,
"\", "/utf8>>/binary,
To_str@1/binary>>/binary,
"), ..query]"/utf8>>
),
_pipe@4 = oaspec@internal@util@string_extra:indent(
_pipe@3,
2,
<<"None -> query"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@4, 1, <<"}"/utf8>>)
end.
-file("src/oaspec/internal/codegen/client.gleam", 594).
?DOC(false).
-spec http_method_to_transport(oaspec@internal@openapi@spec:http_method()) -> binary().
http_method_to_transport(Method) ->
case Method of
get ->
<<"transport.Get"/utf8>>;
post ->
<<"transport.Post"/utf8>>;
put ->
<<"transport.Put"/utf8>>;
delete ->
<<"transport.Delete"/utf8>>;
patch ->
<<"transport.Patch"/utf8>>;
head ->
<<"transport.Head"/utf8>>;
options ->
<<"transport.Options"/utf8>>;
trace ->
<<"transport.Trace"/utf8>>
end.
-file("src/oaspec/internal/codegen/client.gleam", 936).
?DOC(false).
-spec build_call_args(
list(oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved())),
list(oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved())),
list(oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved())),
list(oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved())),
oaspec@internal@openapi@spec:operation(oaspec@internal@openapi@spec:resolved()),
oaspec@internal@codegen@context:context()
) -> binary().
build_call_args(
Path_params,
Query_params,
Header_params,
Cookie_params,
Operation,
_
) ->
All_params = begin
_pipe = lists:append(Path_params, Query_params),
_pipe@1 = lists:append(_pipe, Header_params),
lists:append(_pipe@1, Cookie_params)
end,
Field_names = oaspec@internal@codegen@client_request:build_param_field_names(
Operation
),
Names = gleam@list:map(
All_params,
fun(P) ->
Field = oaspec@internal@codegen@client_request:field_name_for(
Field_names,
P
),
<<<<Field/binary, ": "/utf8>>/binary, Field/binary>>
end
),
Body_args = case erlang:element(7, Operation) of
{some, {value, Rb}} ->
Content_entries = oaspec@internal@codegen@ir_build:sorted_entries(
erlang:element(3, Rb)
),
case Content_entries of
[_, _ | _] ->
[<<"content_type: content_type"/utf8>>,
<<"body: body"/utf8>>];
_ ->
[<<"body: body"/utf8>>]
end;
_ ->
[]
end,
All = lists:append(Names, Body_args),
case All of
[] ->
<<"()"/utf8>>;
_ ->
<<<<"("/utf8, (gleam@string:join(All, <<", "/utf8>>))/binary>>/binary,
")"/utf8>>
end.
-file("src/oaspec/internal/codegen/client.gleam", 978).
?DOC(false).
-spec rebind_request_fields(binary()) -> binary().
rebind_request_fields(Extra) ->
gleam@string:replace(Extra, <<"req."/utf8>>, <<"request."/utf8>>).
-file("src/oaspec/internal/codegen/client.gleam", 984).
?DOC(false).
-spec trim_leading_comma(binary()) -> binary().
trim_leading_comma(S) ->
gleam@bool:guard(
not gleam_stdlib:string_starts_with(S, <<", "/utf8>>),
S,
fun() -> gleam@string:drop_start(S, 2) end
).
-file("src/oaspec/internal/codegen/client.gleam", 1390).
?DOC(false).
-spec generate_multipart_body_emission(
gleam@string_tree:string_tree(),
oaspec@internal@openapi@spec:request_body(oaspec@internal@openapi@spec:resolved()),
binary(),
oaspec@internal@codegen@context:context()
) -> gleam@string_tree:string_tree().
generate_multipart_body_emission(Sb, Rb, Op_id, Ctx) ->
Sb@1 = oaspec@internal@codegen@client_request:generate_multipart_body(
Sb,
Rb,
Op_id,
Ctx
),
_pipe = Sb@1,
oaspec@internal@util@string_extra:indent(
_pipe,
1,
<<"let body = transport.TextBody(body_str)"/utf8>>
).
-file("src/oaspec/internal/codegen/client.gleam", 1404).
?DOC(false).
-spec generate_form_urlencoded_body_emission(
gleam@string_tree:string_tree(),
oaspec@internal@openapi@spec:request_body(oaspec@internal@openapi@spec:resolved()),
binary(),
oaspec@internal@codegen@context:context()
) -> gleam@string_tree:string_tree().
generate_form_urlencoded_body_emission(Sb, Rb, Op_id, Ctx) ->
case erlang:element(4, Rb) of
true ->
Sb@1 = oaspec@internal@codegen@client_request:generate_form_urlencoded_body(
Sb,
Rb,
Op_id,
Ctx
),
_pipe = Sb@1,
oaspec@internal@util@string_extra:indent(
_pipe,
1,
<<"let body = transport.TextBody(body_str)"/utf8>>
);
false ->
_pipe@1 = Sb,
_pipe@2 = oaspec@internal@util@string_extra:indent(
_pipe@1,
1,
<<"let body_str = case body {"/utf8>>
),
_pipe@3 = oaspec@internal@util@string_extra:indent(
_pipe@2,
2,
<<"Some(body) -> {"/utf8>>
),
_pipe@4 = oaspec@internal@codegen@client_request:generate_form_urlencoded_body(
_pipe@3,
Rb,
Op_id,
Ctx
),
_pipe@5 = oaspec@internal@util@string_extra:indent(
_pipe@4,
3,
<<"body_str"/utf8>>
),
_pipe@6 = oaspec@internal@util@string_extra:indent(
_pipe@5,
2,
<<"}"/utf8>>
),
_pipe@7 = oaspec@internal@util@string_extra:indent(
_pipe@6,
2,
<<"None -> \"\""/utf8>>
),
_pipe@8 = oaspec@internal@util@string_extra:indent(
_pipe@7,
1,
<<"}"/utf8>>
),
_pipe@9 = oaspec@internal@util@string_extra:indent(
_pipe@8,
1,
<<"let body_content_type = \"application/x-www-form-urlencoded\""/utf8>>
),
_pipe@10 = oaspec@internal@util@string_extra:indent(
_pipe@9,
1,
<<"let body = case body {"/utf8>>
),
_pipe@11 = oaspec@internal@util@string_extra:indent(
_pipe@10,
2,
<<"Some(_) -> transport.TextBody(body_str)"/utf8>>
),
_pipe@12 = oaspec@internal@util@string_extra:indent(
_pipe@11,
2,
<<"None -> transport.EmptyBody"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@12, 1, <<"}"/utf8>>)
end.
-file("src/oaspec/internal/codegen/client.gleam", 1312).
?DOC(false).
-spec generate_body_emission(
gleam@string_tree:string_tree(),
oaspec@internal@openapi@spec:request_body(oaspec@internal@openapi@spec:resolved()),
binary(),
oaspec@internal@codegen@context:context()
) -> gleam@string_tree:string_tree().
generate_body_emission(Sb, Rb, Op_id, Ctx) ->
Content_entries = oaspec@internal@codegen@ir_build:sorted_entries(
erlang:element(3, Rb)
),
case Content_entries of
[_, _ | _] ->
case erlang:element(4, Rb) of
true ->
_pipe = Sb,
oaspec@internal@util@string_extra:indent(
_pipe,
1,
<<"let body = transport.TextBody(body)"/utf8>>
);
false ->
_pipe@1 = Sb,
_pipe@2 = oaspec@internal@util@string_extra:indent(
_pipe@1,
1,
<<"let body = case body {"/utf8>>
),
_pipe@3 = oaspec@internal@util@string_extra:indent(
_pipe@2,
2,
<<"Some(b) -> transport.TextBody(b)"/utf8>>
),
_pipe@4 = oaspec@internal@util@string_extra:indent(
_pipe@3,
2,
<<"None -> transport.EmptyBody"/utf8>>
),
oaspec@internal@util@string_extra:indent(
_pipe@4,
1,
<<"}"/utf8>>
)
end;
[{Content_type_key, _}] ->
case Content_type_key of
<<"application/octet-stream"/utf8>> ->
case erlang:element(4, Rb) of
true ->
_pipe@5 = Sb,
oaspec@internal@util@string_extra:indent(
_pipe@5,
1,
<<"let body = transport.BytesBody(body)"/utf8>>
);
false ->
_pipe@6 = Sb,
_pipe@7 = oaspec@internal@util@string_extra:indent(
_pipe@6,
1,
<<"let body = case body {"/utf8>>
),
_pipe@8 = oaspec@internal@util@string_extra:indent(
_pipe@7,
2,
<<"Some(b) -> transport.BytesBody(b)"/utf8>>
),
_pipe@9 = oaspec@internal@util@string_extra:indent(
_pipe@8,
2,
<<"None -> transport.EmptyBody"/utf8>>
),
oaspec@internal@util@string_extra:indent(
_pipe@9,
1,
<<"}"/utf8>>
)
end;
<<"*/*"/utf8>> ->
case erlang:element(4, Rb) of
true ->
_pipe@5 = Sb,
oaspec@internal@util@string_extra:indent(
_pipe@5,
1,
<<"let body = transport.BytesBody(body)"/utf8>>
);
false ->
_pipe@6 = Sb,
_pipe@7 = oaspec@internal@util@string_extra:indent(
_pipe@6,
1,
<<"let body = case body {"/utf8>>
),
_pipe@8 = oaspec@internal@util@string_extra:indent(
_pipe@7,
2,
<<"Some(b) -> transport.BytesBody(b)"/utf8>>
),
_pipe@9 = oaspec@internal@util@string_extra:indent(
_pipe@8,
2,
<<"None -> transport.EmptyBody"/utf8>>
),
oaspec@internal@util@string_extra:indent(
_pipe@9,
1,
<<"}"/utf8>>
)
end;
<<"multipart/form-data"/utf8>> ->
generate_multipart_body_emission(Sb, Rb, Op_id, Ctx);
<<"application/x-www-form-urlencoded"/utf8>> ->
generate_form_urlencoded_body_emission(Sb, Rb, Op_id, Ctx);
<<"text/plain"/utf8>> ->
case erlang:element(4, Rb) of
true ->
_pipe@10 = Sb,
oaspec@internal@util@string_extra:indent(
_pipe@10,
1,
<<"let body = transport.TextBody(body)"/utf8>>
);
false ->
_pipe@11 = Sb,
_pipe@12 = oaspec@internal@util@string_extra:indent(
_pipe@11,
1,
<<"let body = case body {"/utf8>>
),
_pipe@13 = oaspec@internal@util@string_extra:indent(
_pipe@12,
2,
<<"Some(b) -> transport.TextBody(b)"/utf8>>
),
_pipe@14 = oaspec@internal@util@string_extra:indent(
_pipe@13,
2,
<<"None -> transport.EmptyBody"/utf8>>
),
oaspec@internal@util@string_extra:indent(
_pipe@14,
1,
<<"}"/utf8>>
)
end;
_ ->
Encode_expr = oaspec@internal@codegen@client_request:get_body_encode_expr(
Rb,
Op_id,
Ctx
),
case erlang:element(4, Rb) of
true ->
_pipe@15 = Sb,
oaspec@internal@util@string_extra:indent(
_pipe@15,
1,
<<<<"let body = transport.TextBody("/utf8,
Encode_expr/binary>>/binary,
")"/utf8>>
);
false ->
_pipe@16 = Sb,
_pipe@17 = oaspec@internal@util@string_extra:indent(
_pipe@16,
1,
<<"let body = case body {"/utf8>>
),
_pipe@18 = oaspec@internal@util@string_extra:indent(
_pipe@17,
2,
<<<<"Some(body) -> transport.TextBody("/utf8,
Encode_expr/binary>>/binary,
")"/utf8>>
),
_pipe@19 = oaspec@internal@util@string_extra:indent(
_pipe@18,
2,
<<"None -> transport.EmptyBody"/utf8>>
),
oaspec@internal@util@string_extra:indent(
_pipe@19,
1,
<<"}"/utf8>>
)
end
end;
[] ->
_pipe@20 = Sb,
oaspec@internal@util@string_extra:indent(
_pipe@20,
1,
<<"let body = transport.EmptyBody"/utf8>>
)
end.
-file("src/oaspec/internal/codegen/client.gleam", 992).
?DOC(false).
-spec generate_build_body(
gleam@string_tree:string_tree(),
binary(),
oaspec@internal@openapi@spec:operation(oaspec@internal@openapi@spec:resolved()),
binary(),
oaspec@internal@openapi@spec:http_method(),
list(oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved())),
list(oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved())),
list(oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved())),
list(oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved())),
oaspec@internal@codegen@context:context()
) -> gleam@string_tree:string_tree().
generate_build_body(
Sb,
Op_id,
Operation,
Path,
Method,
Path_params,
Query_params,
Header_params,
Cookie_params,
Ctx
) ->
Field_names = oaspec@internal@codegen@client_request:build_param_field_names(
Operation
),
Client_guard_schema = case {oaspec@config:validate(
oaspec@internal@codegen@context:config(Ctx)
),
erlang:element(7, Operation)} of
{true, {some, {value, Rb}}} ->
Content_entries = maps:to_list(erlang:element(3, Rb)),
case Content_entries of
[{_, Mt}] ->
case erlang:element(2, Mt) of
{some, {reference, _, Name}} ->
case oaspec@internal@codegen@guards:schema_has_validator(
Name,
Ctx
) of
true ->
{some, {Name, erlang:element(4, Rb)}};
false ->
none
end;
_ ->
none
end;
_ ->
none
end;
{_, _} ->
none
end,
Sb@1 = case Client_guard_schema of
{some, {Name@1, true}} ->
Validate_fn = <<<<"guards.validate_"/utf8,
(oaspec@internal@util@naming:to_snake_case(Name@1))/binary>>/binary,
"(body)"/utf8>>,
_pipe = Sb,
_pipe@1 = oaspec@internal@util@string_extra:indent(
_pipe,
1,
<<<<"case "/utf8, Validate_fn/binary>>/binary, " {"/utf8>>
),
_pipe@2 = oaspec@internal@util@string_extra:indent(
_pipe@1,
2,
<<"Error(errors) -> Error(ValidationError(errors:))"/utf8>>
),
oaspec@internal@util@string_extra:indent(
_pipe@2,
2,
<<"Ok(_) -> {"/utf8>>
);
{some, {Name@2, false}} ->
Validate_fn@1 = <<"guards.validate_"/utf8,
(oaspec@internal@util@naming:to_snake_case(Name@2))/binary>>,
_pipe@3 = Sb,
_pipe@4 = oaspec@internal@util@string_extra:indent(
_pipe@3,
1,
<<"let validation_errors = case body {"/utf8>>
),
_pipe@5 = oaspec@internal@util@string_extra:indent(
_pipe@4,
2,
<<<<"Some(b) -> case "/utf8, Validate_fn@1/binary>>/binary,
"(b) {"/utf8>>
),
_pipe@6 = oaspec@internal@util@string_extra:indent(
_pipe@5,
3,
<<"Error(errors) -> errors"/utf8>>
),
_pipe@7 = oaspec@internal@util@string_extra:indent(
_pipe@6,
3,
<<"Ok(_) -> []"/utf8>>
),
_pipe@8 = oaspec@internal@util@string_extra:indent(
_pipe@7,
2,
<<"}"/utf8>>
),
_pipe@9 = oaspec@internal@util@string_extra:indent(
_pipe@8,
2,
<<"None -> []"/utf8>>
),
_pipe@10 = oaspec@internal@util@string_extra:indent(
_pipe@9,
1,
<<"}"/utf8>>
),
_pipe@11 = oaspec@internal@util@string_extra:indent(
_pipe@10,
1,
<<"case validation_errors {"/utf8>>
),
_pipe@12 = oaspec@internal@util@string_extra:indent(
_pipe@11,
2,
<<"[_, ..] -> Error(ValidationError(errors: validation_errors))"/utf8>>
),
oaspec@internal@util@string_extra:indent(
_pipe@12,
2,
<<"[] -> {"/utf8>>
);
none ->
Sb
end,
Effective_server_url = case erlang:element(12, Operation) of
[First_server | _] ->
Variables = oaspec@internal@codegen@ir_build:sorted_entries(
erlang:element(4, First_server)
),
Resolved = substitute_server_variables(
erlang:element(2, First_server),
Variables
),
{some, Resolved};
[] ->
case erlang:element(6, oaspec@internal@codegen@context:spec(Ctx)) of
[_ | _] ->
{some, <<"default_base_url()"/utf8>>};
[] ->
none
end
end,
Sb@2 = begin
_pipe@13 = Sb@1,
oaspec@internal@util@string_extra:indent(
_pipe@13,
1,
<<<<"let path = \""/utf8, Path/binary>>/binary, "\""/utf8>>
)
end,
Sb@4 = gleam@list:fold(
Path_params,
Sb@2,
fun(Sb@3, P) ->
Param_name = oaspec@internal@codegen@client_request:field_name_for(
Field_names,
P
),
To_string_expr = oaspec@internal@codegen@client_request:param_to_string_expr(
P,
Param_name,
Ctx
),
_pipe@14 = Sb@3,
oaspec@internal@util@string_extra:indent(
_pipe@14,
1,
<<<<<<<<"let path = string.replace(path, \"{"/utf8,
(erlang:element(2, P))/binary>>/binary,
"}\", uri.percent_encode("/utf8>>/binary,
To_string_expr/binary>>/binary,
"))"/utf8>>
)
end
),
Sb@8 = case gleam@list:is_empty(Query_params) of
true ->
_pipe@15 = Sb@4,
oaspec@internal@util@string_extra:indent(
_pipe@15,
1,
<<"let query = []"/utf8>>
);
false ->
Sb@5 = begin
_pipe@16 = Sb@4,
oaspec@internal@util@string_extra:indent(
_pipe@16,
1,
<<"let query = []"/utf8>>
)
end,
Sb@7 = gleam@list:fold(
Query_params,
Sb@5,
fun(Sb@6, P@1) ->
Param_name@1 = oaspec@internal@codegen@client_request:field_name_for(
Field_names,
P@1
),
case oaspec@internal@codegen@operation_ir:is_deep_object_param(
P@1,
Ctx
) of
true ->
emit_deep_object_query_param(
Sb@6,
P@1,
Param_name@1,
Op_id,
Ctx
);
false ->
case oaspec@internal@codegen@client_request:is_exploded_array_param(
P@1,
Ctx
) of
true ->
oaspec@internal@codegen@client_request:generate_exploded_array_query_param(
Sb@6,
P@1,
Param_name@1,
Ctx
);
false ->
case oaspec@internal@codegen@client_request:is_delimited_array_param(
P@1,
Ctx
) of
{some, Joiner} ->
oaspec@internal@codegen@client_request:generate_delimited_array_query_param(
Sb@6,
P@1,
Param_name@1,
Joiner,
Ctx
);
none ->
emit_simple_query_param(
Sb@6,
P@1,
Param_name@1,
Ctx
)
end
end
end
end
),
_pipe@17 = Sb@7,
oaspec@internal@util@string_extra:indent(
_pipe@17,
1,
<<"let query = list.reverse(query)"/utf8>>
)
end,
Sb@9 = begin
_pipe@18 = Sb@8,
oaspec@internal@util@string_extra:indent(
_pipe@18,
1,
<<"let headers = []"/utf8>>
)
end,
Sb@11 = gleam@list:fold(
Header_params,
Sb@9,
fun(Sb@10, P@2) ->
Param_name@2 = oaspec@internal@codegen@client_request:field_name_for(
Field_names,
P@2
),
Header_name = string:lowercase(erlang:element(2, P@2)),
case erlang:element(5, P@2) of
true ->
To_str = oaspec@internal@codegen@client_request:param_to_string_expr(
P@2,
Param_name@2,
Ctx
),
_pipe@19 = Sb@10,
oaspec@internal@util@string_extra:indent(
_pipe@19,
1,
<<<<<<<<"let headers = [#(\""/utf8, Header_name/binary>>/binary,
"\", "/utf8>>/binary,
To_str/binary>>/binary,
"), ..headers]"/utf8>>
);
false ->
To_str@1 = oaspec@internal@codegen@client_request:to_str_for_optional_value(
P@2,
Ctx
),
_pipe@20 = Sb@10,
_pipe@21 = oaspec@internal@util@string_extra:indent(
_pipe@20,
1,
<<<<"let headers = case "/utf8, Param_name@2/binary>>/binary,
" {"/utf8>>
),
_pipe@22 = oaspec@internal@util@string_extra:indent(
_pipe@21,
2,
<<<<<<<<"Some(v) -> [#(\""/utf8, Header_name/binary>>/binary,
"\", "/utf8>>/binary,
To_str@1/binary>>/binary,
"), ..headers]"/utf8>>
),
_pipe@23 = oaspec@internal@util@string_extra:indent(
_pipe@22,
2,
<<"None -> headers"/utf8>>
),
oaspec@internal@util@string_extra:indent(
_pipe@23,
1,
<<"}"/utf8>>
)
end
end
),
Sb@15 = case gleam@list:is_empty(Cookie_params) of
true ->
Sb@11;
false ->
Sb@12 = begin
_pipe@24 = Sb@11,
oaspec@internal@util@string_extra:indent(
_pipe@24,
1,
<<"let cookie_parts = []"/utf8>>
)
end,
Sb@14 = gleam@list:fold(
Cookie_params,
Sb@12,
fun(Sb@13, P@3) ->
Param_name@3 = oaspec@internal@codegen@client_request:field_name_for(
Field_names,
P@3
),
case erlang:element(5, P@3) of
true ->
To_str@2 = oaspec@internal@codegen@client_request:param_to_string_expr(
P@3,
Param_name@3,
Ctx
),
_pipe@25 = Sb@13,
oaspec@internal@util@string_extra:indent(
_pipe@25,
1,
<<<<<<<<"let cookie_parts = [\""/utf8,
(erlang:element(2, P@3))/binary>>/binary,
"=\" <> uri.percent_encode("/utf8>>/binary,
To_str@2/binary>>/binary,
"), ..cookie_parts]"/utf8>>
);
false ->
To_str@3 = oaspec@internal@codegen@client_request:to_str_for_optional_value(
P@3,
Ctx
),
_pipe@26 = Sb@13,
_pipe@27 = oaspec@internal@util@string_extra:indent(
_pipe@26,
1,
<<<<"let cookie_parts = case "/utf8,
Param_name@3/binary>>/binary,
" {"/utf8>>
),
_pipe@28 = oaspec@internal@util@string_extra:indent(
_pipe@27,
2,
<<<<<<<<"Some(v) -> [\""/utf8,
(erlang:element(2, P@3))/binary>>/binary,
"=\" <> uri.percent_encode("/utf8>>/binary,
To_str@3/binary>>/binary,
"), ..cookie_parts]"/utf8>>
),
_pipe@29 = oaspec@internal@util@string_extra:indent(
_pipe@28,
2,
<<"None -> cookie_parts"/utf8>>
),
oaspec@internal@util@string_extra:indent(
_pipe@29,
1,
<<"}"/utf8>>
)
end
end
),
_pipe@30 = Sb@14,
_pipe@31 = oaspec@internal@util@string_extra:indent(
_pipe@30,
1,
<<"let headers = case cookie_parts {"/utf8>>
),
_pipe@32 = oaspec@internal@util@string_extra:indent(
_pipe@31,
2,
<<"[] -> headers"/utf8>>
),
_pipe@33 = oaspec@internal@util@string_extra:indent(
_pipe@32,
2,
<<"_ -> [#(\"cookie\", string.join(cookie_parts, \"; \")), ..headers]"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@33, 1, <<"}"/utf8>>)
end,
Needs_reverse = not gleam@list:is_empty(Header_params) orelse not gleam@list:is_empty(
Cookie_params
),
Sb@16 = case Needs_reverse of
true ->
_pipe@34 = Sb@15,
oaspec@internal@util@string_extra:indent(
_pipe@34,
1,
<<"let headers = list.reverse(headers)"/utf8>>
);
false ->
Sb@15
end,
Sb@17 = case erlang:element(7, Operation) of
{some, {value, Rb@1}} ->
generate_body_emission(Sb@16, Rb@1, Op_id, Ctx);
_ ->
_pipe@35 = Sb@16,
oaspec@internal@util@string_extra:indent(
_pipe@35,
1,
<<"let body = transport.EmptyBody"/utf8>>
)
end,
Sb@18 = case erlang:element(7, Operation) of
{some, {value, Rb@2}} ->
Content_entries@1 = oaspec@internal@codegen@ir_build:sorted_entries(
erlang:element(3, Rb@2)
),
Ct_expr = case Content_entries@1 of
[_, _ | _] ->
<<"content_type"/utf8>>;
[{<<"multipart/form-data"/utf8>>, _}] ->
<<"body_content_type"/utf8>>;
[{<<"application/x-www-form-urlencoded"/utf8>>, _}] ->
<<"body_content_type"/utf8>>;
[{Static_ct, _}] ->
<<<<"\""/utf8, Static_ct/binary>>/binary, "\""/utf8>>;
[] ->
<<""/utf8>>
end,
case Ct_expr of
<<""/utf8>> ->
Sb@17;
Ct ->
Header_line = <<<<"[#(\"content-type\", "/utf8, Ct/binary>>/binary,
"), ..headers]"/utf8>>,
case erlang:element(4, Rb@2) of
true ->
_pipe@36 = Sb@17,
oaspec@internal@util@string_extra:indent(
_pipe@36,
1,
<<"let headers = "/utf8, Header_line/binary>>
);
false ->
_pipe@37 = Sb@17,
_pipe@38 = oaspec@internal@util@string_extra:indent(
_pipe@37,
1,
<<"let headers = case body {"/utf8>>
),
_pipe@39 = oaspec@internal@util@string_extra:indent(
_pipe@38,
2,
<<"transport.EmptyBody -> headers"/utf8>>
),
_pipe@40 = oaspec@internal@util@string_extra:indent(
_pipe@39,
2,
<<"_ -> "/utf8, Header_line/binary>>
),
oaspec@internal@util@string_extra:indent(
_pipe@40,
1,
<<"}"/utf8>>
)
end
end;
_ ->
Sb@17
end,
Base_url_expr = case Effective_server_url of
{some, <<"default_base_url()"/utf8>>} ->
<<"Some(default_base_url())"/utf8>>;
{some, Url} ->
<<<<"Some(\""/utf8, Url/binary>>/binary, "\")"/utf8>>;
none ->
<<"None"/utf8>>
end,
Effective_security = case erlang:element(10, Operation) of
{some, Sec} ->
Sec;
none ->
erlang:element(7, oaspec@internal@codegen@context:spec(Ctx))
end,
Security_literal = oaspec@internal@codegen@client_security:render_security_metadata(
Ctx,
Effective_security
),
Http_method = http_method_to_transport(Method),
Sb@19 = begin
_pipe@41 = Sb@18,
_pipe@42 = oaspec@internal@util@string_extra:indent(
_pipe@41,
1,
<<"Ok(transport.Request("/utf8>>
),
_pipe@43 = oaspec@internal@util@string_extra:indent(
_pipe@42,
2,
<<<<"method: "/utf8, Http_method/binary>>/binary, ","/utf8>>
),
_pipe@44 = oaspec@internal@util@string_extra:indent(
_pipe@43,
2,
<<<<"base_url: "/utf8, Base_url_expr/binary>>/binary, ","/utf8>>
),
_pipe@45 = oaspec@internal@util@string_extra:indent(
_pipe@44,
2,
<<"path: path,"/utf8>>
),
_pipe@46 = oaspec@internal@util@string_extra:indent(
_pipe@45,
2,
<<"query: query,"/utf8>>
),
_pipe@47 = oaspec@internal@util@string_extra:indent(
_pipe@46,
2,
<<"headers: headers,"/utf8>>
),
_pipe@48 = oaspec@internal@util@string_extra:indent(
_pipe@47,
2,
<<"body: body,"/utf8>>
),
_pipe@49 = oaspec@internal@util@string_extra:indent(
_pipe@48,
2,
<<<<"security: "/utf8, Security_literal/binary>>/binary, ","/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@49, 1, <<"))"/utf8>>)
end,
case Client_guard_schema of
{some, _} ->
_pipe@50 = Sb@19,
_pipe@51 = oaspec@internal@util@string_extra:indent(
_pipe@50,
1,
<<"}"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@51, 1, <<"}"/utf8>>);
none ->
Sb@19
end.
-file("src/oaspec/internal/codegen/client.gleam", 609).
?DOC(false).
-spec generate_client_function(
gleam@string_tree:string_tree(),
binary(),
oaspec@internal@openapi@spec:operation(oaspec@internal@openapi@spec:resolved()),
binary(),
oaspec@internal@openapi@spec:http_method(),
oaspec@internal@codegen@context:context()
) -> gleam@string_tree:string_tree().
generate_client_function(Sb, Op_id, Operation, Path, Method, Ctx) ->
Fn_name = oaspec@internal@util@naming:operation_to_function_name(Op_id),
Build_fn = <<<<"build_"/utf8, Fn_name/binary>>/binary, "_request"/utf8>>,
Decode_fn = <<<<"decode_"/utf8, Fn_name/binary>>/binary, "_response"/utf8>>,
Response_type = <<(oaspec@internal@util@naming:schema_to_type_name(Op_id))/binary,
"Response"/utf8>>,
Unwrapped_params = gleam@list:filter_map(
erlang:element(6, Operation),
fun(Ref_p) -> case Ref_p of
{value, P} ->
{ok, P};
_ ->
{error, nil}
end end
),
Path_params = gleam@list:filter(
Unwrapped_params,
fun(P@1) -> erlang:element(3, P@1) =:= in_path end
),
Query_params = gleam@list:filter(
Unwrapped_params,
fun(P@2) -> erlang:element(3, P@2) =:= in_query end
),
Header_params = gleam@list:filter(
Unwrapped_params,
fun(P@3) -> erlang:element(3, P@3) =:= in_header end
),
Cookie_params = gleam@list:filter(
Unwrapped_params,
fun(P@4) -> erlang:element(3, P@4) =:= in_cookie end
),
Params_signature = oaspec@internal@codegen@client_request:build_param_list(
Path_params,
Query_params,
Header_params,
Cookie_params,
Operation,
Op_id,
Ctx
),
Call_args = build_call_args(
Path_params,
Query_params,
Header_params,
Cookie_params,
Operation,
Ctx
),
Sb@1 = case erlang:element(3, Operation) of
{some, Summary} ->
_pipe = Sb,
oaspec@internal@util@string_extra:doc_comment(_pipe, Summary);
_ ->
Sb
end,
Sb@2 = case erlang:element(4, Operation) of
{some, Desc} ->
_pipe@1 = Sb@1,
oaspec@internal@util@string_extra:doc_comment(_pipe@1, Desc);
_ ->
Sb@1
end,
Sb@3 = case erlang:element(7, Operation) of
{some, {value, Rb}} ->
Content_entries = oaspec@internal@codegen@ir_build:sorted_entries(
erlang:element(3, Rb)
),
case Content_entries of
[_, _ | _] ->
Ct_names = begin
_pipe@2 = gleam@list:map(
Content_entries,
fun(E) -> erlang:element(1, E) end
),
gleam@string:join(_pipe@2, <<", "/utf8>>)
end,
_pipe@3 = Sb@2,
oaspec@internal@util@string_extra:doc_comment(
_pipe@3,
<<"Supported content types: "/utf8, Ct_names/binary>>
);
_ ->
Sb@2
end;
_ ->
Sb@2
end,
Sb@4 = begin
_pipe@4 = Sb@3,
oaspec@internal@util@string_extra:line(
_pipe@4,
<<<<<<<<<<<<"pub fn "/utf8, Fn_name/binary>>/binary,
"(send send: transport.Send"/utf8>>/binary,
Params_signature/binary>>/binary,
") -> Result(response_types."/utf8>>/binary,
Response_type/binary>>/binary,
", ClientError) {"/utf8>>
)
end,
Sb@5 = begin
_pipe@5 = Sb@4,
_pipe@6 = oaspec@internal@util@string_extra:indent(
_pipe@5,
1,
<<<<<<"use req <- result.try("/utf8, Build_fn/binary>>/binary,
Call_args/binary>>/binary,
")"/utf8>>
),
_pipe@7 = oaspec@internal@util@string_extra:indent(
_pipe@6,
1,
<<"use resp <- result.try("/utf8>>
),
_pipe@8 = oaspec@internal@util@string_extra:indent(
_pipe@7,
2,
<<"send(req)"/utf8>>
),
_pipe@9 = oaspec@internal@util@string_extra:indent(
_pipe@8,
2,
<<"|> result.map_error(TransportError),"/utf8>>
),
_pipe@10 = oaspec@internal@util@string_extra:indent(
_pipe@9,
1,
<<")"/utf8>>
),
_pipe@11 = oaspec@internal@util@string_extra:indent(
_pipe@10,
1,
<<Decode_fn/binary, "(resp)"/utf8>>
),
_pipe@12 = oaspec@internal@util@string_extra:line(
_pipe@11,
<<"}"/utf8>>
),
oaspec@internal@util@string_extra:blank_line(_pipe@12)
end,
Sb@6 = begin
_pipe@13 = Sb@5,
_pipe@14 = oaspec@internal@util@string_extra:doc_comment(
_pipe@13,
<<<<"Async transport variant of "/utf8, Fn_name/binary>>/binary,
". Resolves to the typed response or a client error."/utf8>>
),
_pipe@15 = oaspec@internal@util@string_extra:line(
_pipe@14,
<<<<<<<<<<<<"pub fn "/utf8, Fn_name/binary>>/binary,
"_async(async_send async_send: transport.AsyncSend"/utf8>>/binary,
Params_signature/binary>>/binary,
") -> transport.Async(Result(response_types."/utf8>>/binary,
Response_type/binary>>/binary,
", ClientError)) {"/utf8>>
),
_pipe@16 = oaspec@internal@util@string_extra:indent(
_pipe@15,
1,
<<<<<<"case "/utf8, Build_fn/binary>>/binary, Call_args/binary>>/binary,
" {"/utf8>>
),
_pipe@17 = oaspec@internal@util@string_extra:indent(
_pipe@16,
2,
<<<<"Ok(req) -> await_response(async_send(req), "/utf8,
Decode_fn/binary>>/binary,
")"/utf8>>
),
_pipe@18 = oaspec@internal@util@string_extra:indent(
_pipe@17,
2,
<<"Error(error) -> transport.resolve(Error(error))"/utf8>>
),
_pipe@19 = oaspec@internal@util@string_extra:indent(
_pipe@18,
1,
<<"}"/utf8>>
),
_pipe@20 = oaspec@internal@util@string_extra:line(
_pipe@19,
<<"}"/utf8>>
),
oaspec@internal@util@string_extra:blank_line(_pipe@20)
end,
Sb@7 = begin
_pipe@21 = Sb@6,
_pipe@22 = oaspec@internal@util@string_extra:doc_comment(
_pipe@21,
<<<<"Build the transport request for "/utf8, Fn_name/binary>>/binary,
" without sending it. Useful for testing and for adding custom transport middleware."/utf8>>
),
oaspec@internal@util@string_extra:line(
_pipe@22,
<<<<<<<<"pub fn "/utf8, Build_fn/binary>>/binary, "("/utf8>>/binary,
(trim_leading_comma(Params_signature))/binary>>/binary,
") -> Result(transport.Request, ClientError) {"/utf8>>
)
end,
Sb@8 = generate_build_body(
Sb@7,
Op_id,
Operation,
Path,
Method,
Path_params,
Query_params,
Header_params,
Cookie_params,
Ctx
),
Sb@9 = begin
_pipe@23 = Sb@8,
_pipe@24 = oaspec@internal@util@string_extra:line(
_pipe@23,
<<"}"/utf8>>
),
oaspec@internal@util@string_extra:blank_line(_pipe@24)
end,
Sb@10 = begin
_pipe@25 = Sb@9,
_pipe@26 = oaspec@internal@util@string_extra:doc_comment(
_pipe@25,
<<<<"Decode a transport response into the typed response variant for "/utf8,
Fn_name/binary>>/binary,
"."/utf8>>
),
_pipe@27 = oaspec@internal@util@string_extra:line(
_pipe@26,
<<<<<<<<"pub fn "/utf8, Decode_fn/binary>>/binary,
"(resp: transport.Response) -> Result(response_types."/utf8>>/binary,
Response_type/binary>>/binary,
", ClientError) {"/utf8>>
),
oaspec@internal@util@string_extra:indent(
_pipe@27,
1,
<<"case resp.status {"/utf8>>
)
end,
Responses = oaspec@internal@util@http:sort_response_entries(
maps:to_list(erlang:element(8, Operation))
),
Sb@12 = gleam@list:fold(
Responses,
Sb@10,
fun(Sb@11, Entry) ->
{Status_code, Ref_or} = Entry,
case Ref_or of
{value, Response} ->
Variant_name = <<<<<<"response_types."/utf8,
(oaspec@internal@util@naming:schema_to_type_name(
Op_id
))/binary>>/binary,
"Response"/utf8>>/binary,
(oaspec@internal@util@http:status_code_suffix(
Status_code
))/binary>>,
Content_entries@1 = oaspec@internal@codegen@ir_build:sorted_entries(
erlang:element(3, Response)
),
Headers_record = oaspec@internal@codegen@client_response:build_headers_record(
Op_id,
Status_code,
Response
),
case Content_entries@1 of
[] ->
oaspec@internal@codegen@client_response:generate_empty_content_response(
Sb@11,
Status_code,
Variant_name,
Headers_record
);
[{Single_ct, Single_mt}] ->
oaspec@internal@codegen@client_response:generate_single_content_response(
Sb@11,
Status_code,
Variant_name,
Single_ct,
Single_mt,
Op_id,
Ctx,
Headers_record
);
Multiple ->
oaspec@internal@codegen@client_response:generate_multi_content_response(
Sb@11,
Status_code,
Variant_name,
Multiple,
Op_id,
Ctx,
Headers_record
)
end;
_ ->
Sb@11
end
end
),
Has_default = gleam@list:any(
Responses,
fun(Entry@1) ->
{Code, _} = Entry@1,
Code =:= default_status
end
),
Sb@13 = case Has_default of
true ->
Sb@12;
false ->
_pipe@28 = Sb@12,
_pipe@29 = oaspec@internal@util@string_extra:indent(
_pipe@28,
2,
<<"_ ->"/utf8>>
),
_pipe@30 = oaspec@internal@util@string_extra:indent(
_pipe@29,
3,
<<"Error(UnexpectedStatus("/utf8>>
),
_pipe@31 = oaspec@internal@util@string_extra:indent(
_pipe@30,
4,
<<"status: resp.status,"/utf8>>
),
_pipe@32 = oaspec@internal@util@string_extra:indent(
_pipe@31,
4,
<<"headers: resp.headers,"/utf8>>
),
_pipe@33 = oaspec@internal@util@string_extra:indent(
_pipe@32,
4,
<<"body: resp.body,"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@33, 3, <<"))"/utf8>>)
end,
Sb@14 = begin
_pipe@34 = Sb@13,
_pipe@35 = oaspec@internal@util@string_extra:indent(
_pipe@34,
1,
<<"}"/utf8>>
),
_pipe@36 = oaspec@internal@util@string_extra:line(
_pipe@35,
<<"}"/utf8>>
),
oaspec@internal@util@string_extra:blank_line(_pipe@36)
end,
case oaspec@internal@codegen@client_request:build_request_object_call_args(
Path_params,
Query_params,
Header_params,
Cookie_params,
Operation
) of
{some, Call_args2} ->
Request_type = <<(oaspec@internal@util@naming:schema_to_type_name(
Op_id
))/binary,
"Request"/utf8>>,
Extra = case Call_args2 of
<<""/utf8>> ->
<<""/utf8>>;
_ ->
<<", "/utf8, Call_args2/binary>>
end,
_pipe@37 = Sb@14,
_pipe@38 = oaspec@internal@util@string_extra:doc_comment(
_pipe@37,
<<<<"Request-object wrapper. Delegates to "/utf8,
Fn_name/binary>>/binary,
" with fields unpacked from the request record."/utf8>>
),
_pipe@39 = oaspec@internal@util@string_extra:line(
_pipe@38,
<<<<<<<<<<<<"pub fn "/utf8, Fn_name/binary>>/binary,
"_with_request(send send: transport.Send, request request: request_types."/utf8>>/binary,
Request_type/binary>>/binary,
") -> Result(response_types."/utf8>>/binary,
Response_type/binary>>/binary,
", ClientError) {"/utf8>>
),
_pipe@40 = oaspec@internal@util@string_extra:indent(
_pipe@39,
1,
<<<<<<Fn_name/binary, "(send"/utf8>>/binary,
(rebind_request_fields(Extra))/binary>>/binary,
")"/utf8>>
),
_pipe@41 = oaspec@internal@util@string_extra:line(
_pipe@40,
<<"}"/utf8>>
),
_pipe@42 = oaspec@internal@util@string_extra:blank_line(_pipe@41),
_pipe@43 = oaspec@internal@util@string_extra:doc_comment(
_pipe@42,
<<<<"Async request-object wrapper. Delegates to "/utf8,
Fn_name/binary>>/binary,
"_async with fields unpacked from the request record."/utf8>>
),
_pipe@44 = oaspec@internal@util@string_extra:line(
_pipe@43,
<<<<<<<<<<<<"pub fn "/utf8, Fn_name/binary>>/binary,
"_with_request_async(async_send async_send: transport.AsyncSend, request request: request_types."/utf8>>/binary,
Request_type/binary>>/binary,
") -> transport.Async(Result(response_types."/utf8>>/binary,
Response_type/binary>>/binary,
", ClientError)) {"/utf8>>
),
_pipe@45 = oaspec@internal@util@string_extra:indent(
_pipe@44,
1,
<<<<<<Fn_name/binary, "_async(async_send"/utf8>>/binary,
(rebind_request_fields(Extra))/binary>>/binary,
")"/utf8>>
),
_pipe@46 = oaspec@internal@util@string_extra:line(
_pipe@45,
<<"}"/utf8>>
),
oaspec@internal@util@string_extra:blank_line(_pipe@46);
none ->
Sb@14
end.
-file("src/oaspec/internal/codegen/client.gleam", 40).
?DOC(false).
-spec generate_client(oaspec@internal@codegen@context:context()) -> binary().
generate_client(Ctx) ->
Operations = oaspec@internal@codegen@context:operations(Ctx),
Requirements = oaspec@internal@codegen@client_ir:analyze(Ctx),
Imports = oaspec@internal@codegen@client_ir:imports(Requirements, Ctx),
Sb = begin
_pipe = oaspec@internal@util@string_extra:file_header(<<"0.62.0"/utf8>>),
oaspec@internal@util@string_extra:imports(_pipe, Imports)
end,
Sb@1 = begin
_pipe@1 = Sb,
_pipe@2 = oaspec@internal@util@string_extra:doc_comment(
_pipe@1,
<<"HTTP client errors."/utf8>>
),
_pipe@3 = oaspec@internal@util@string_extra:line(
_pipe@2,
<<"pub type ClientError {"/utf8>>
),
_pipe@4 = oaspec@internal@util@string_extra:indent(
_pipe@3,
1,
<<"TransportError(error: transport.TransportError)"/utf8>>
),
_pipe@5 = oaspec@internal@util@string_extra:indent(
_pipe@4,
1,
<<"DecodeFailure(detail: String)"/utf8>>
),
_pipe@6 = oaspec@internal@util@string_extra:indent(
_pipe@5,
1,
<<"InvalidResponse(detail: String)"/utf8>>
),
_pipe@7 = oaspec@internal@util@string_extra:indent(
_pipe@6,
1,
<<"UnexpectedStatus("/utf8>>
),
_pipe@8 = oaspec@internal@util@string_extra:indent(
_pipe@7,
2,
<<"status: Int,"/utf8>>
),
_pipe@9 = oaspec@internal@util@string_extra:indent(
_pipe@8,
2,
<<"headers: List(#(String, String)),"/utf8>>
),
_pipe@10 = oaspec@internal@util@string_extra:indent(
_pipe@9,
2,
<<"body: transport.Body,"/utf8>>
),
oaspec@internal@util@string_extra:indent(_pipe@10, 1, <<")"/utf8>>)
end,
Sb@2 = case erlang:element(19, Requirements) of
true ->
_pipe@11 = Sb@1,
oaspec@internal@util@string_extra:indent(
_pipe@11,
1,
<<"ValidationError(errors: List(guards.ValidationFailure))"/utf8>>
);
false ->
Sb@1
end,
Sb@3 = begin
_pipe@12 = Sb@2,
_pipe@13 = oaspec@internal@util@string_extra:line(
_pipe@12,
<<"}"/utf8>>
),
oaspec@internal@util@string_extra:blank_line(_pipe@13)
end,
Sb@4 = generate_default_base_url(Sb@3, Ctx),
Sb@5 = case erlang:element(17, Requirements) of
true ->
generate_text_body_helper(Sb@4);
false ->
Sb@4
end,
Sb@6 = case erlang:element(16, Requirements) of
true ->
generate_bytes_body_helper(Sb@5);
false ->
Sb@5
end,
Sb@7 = case Operations of
[] ->
Sb@6;
_ ->
generate_async_response_helper(Sb@6)
end,
Sb@9 = gleam@list:fold(
Operations,
Sb@7,
fun(Sb@8, Op) ->
{Op_id, Operation, Path, Method} = Op,
generate_client_function(Sb@8, Op_id, Operation, Path, Method, Ctx)
end
),
oaspec@internal@util@string_extra:to_string(Sb@9).
-file("src/oaspec/internal/codegen/client.gleam", 26).
?DOC(false).
-spec generate(oaspec@internal@codegen@context:context()) -> list(oaspec@internal@codegen@context:generated_file()).
generate(Ctx) ->
Client_content = generate_client(Ctx),
[{generated_file,
<<"client.gleam"/utf8>>,
Client_content,
client_target,
overwrite}].