-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, <<<<<>/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 = <<<>/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 = <<<>/binary, Gleam_field/binary>>, Key = <<<<<>/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 = <<<>/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 ), <<<>/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, <> ), _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, <<<<<>/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, <<<<<>/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.67.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}].