-module(oaspec@internal@codegen@client_security). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/oaspec/internal/codegen/client_security.gleam"). -export([capitalize_first/1, generate_security_or_chain/4, maybe_percent_encode/2]). -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_security.gleam", 12). ?DOC(false). -spec capitalize_first(binary()) -> binary(). capitalize_first(Value) -> case gleam_stdlib:string_pop_grapheme(Value) of {ok, {First, Rest}} -> <<(string:uppercase(First))/binary, Rest/binary>>; {error, _} -> Value end. -file("src/oaspec/internal/codegen/client_security.gleam", 185). ?DOC(false). -spec generate_scheme_some_branch( gleam@string_tree:string_tree(), oaspec@internal@codegen@context:context(), oaspec@internal@openapi@spec:security_scheme_ref(), integer() ) -> gleam@string_tree:string_tree(). generate_scheme_some_branch(Sb, Ctx, Scheme_ref, Indent) -> case erlang:element(5, oaspec@internal@codegen@context:spec(Ctx)) of {some, Components} -> case gleam_stdlib:map_get( erlang:element(6, Components), erlang:element(2, Scheme_ref) ) of {ok, {value, {api_key_scheme, Header_name, scheme_in_header}}} -> _pipe = Sb, oaspec@internal@util@string_extra:indent( _pipe, Indent, <<<<"Some(key) -> request.set_header(req, \""/utf8, (string:lowercase(Header_name))/binary>>/binary, "\", key)"/utf8>> ); {ok, {value, {api_key_scheme, Query_name, scheme_in_query}}} -> _pipe@1 = Sb, _pipe@2 = oaspec@internal@util@string_extra:indent( _pipe@1, Indent, <<"Some(key) -> {"/utf8>> ), _pipe@3 = oaspec@internal@util@string_extra:indent( _pipe@2, Indent + 1, <<"let sep = case string.contains(req.path, \"?\") {"/utf8>> ), _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, Indent + 2, <<"True -> \"&\""/utf8>> ), _pipe@5 = oaspec@internal@util@string_extra:indent( _pipe@4, Indent + 2, <<"False -> \"?\""/utf8>> ), _pipe@6 = oaspec@internal@util@string_extra:indent( _pipe@5, Indent + 1, <<"}"/utf8>> ), _pipe@7 = oaspec@internal@util@string_extra:indent( _pipe@6, Indent + 1, <<<<"request.Request(..req, path: req.path <> sep <> \""/utf8, Query_name/binary>>/binary, "=\" <> key)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@7, Indent, <<"}"/utf8>> ); {ok, {value, {api_key_scheme, Cookie_name, scheme_in_cookie}}} -> _pipe@8 = Sb, _pipe@9 = oaspec@internal@util@string_extra:indent( _pipe@8, Indent, <<"Some(value) -> {"/utf8>> ), _pipe@10 = oaspec@internal@util@string_extra:indent( _pipe@9, Indent + 1, <<"let existing = list.key_find(req.headers, \"cookie\") |> result.unwrap(\"\")"/utf8>> ), _pipe@11 = oaspec@internal@util@string_extra:indent( _pipe@10, Indent + 1, <<<<"let cookie_val = \""/utf8, Cookie_name/binary>>/binary, "=\" <> value"/utf8>> ), _pipe@12 = oaspec@internal@util@string_extra:indent( _pipe@11, Indent + 1, <<"let new_cookie = case existing {"/utf8>> ), _pipe@13 = oaspec@internal@util@string_extra:indent( _pipe@12, Indent + 2, <<"\"\" -> cookie_val"/utf8>> ), _pipe@14 = oaspec@internal@util@string_extra:indent( _pipe@13, Indent + 2, <<"_ -> existing <> \"; \" <> cookie_val"/utf8>> ), _pipe@15 = oaspec@internal@util@string_extra:indent( _pipe@14, Indent + 1, <<"}"/utf8>> ), _pipe@16 = oaspec@internal@util@string_extra:indent( _pipe@15, Indent + 1, <<"request.set_header(req, \"cookie\", new_cookie)"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@16, Indent, <<"}"/utf8>> ); {ok, {value, {http_scheme, <<"basic"/utf8>>, _}}} -> _pipe@17 = Sb, oaspec@internal@util@string_extra:indent( _pipe@17, Indent, <<"Some(token) -> request.set_header(req, \"authorization\", \"Basic \" <> token)"/utf8>> ); {ok, {value, {http_scheme, <<"digest"/utf8>>, _}}} -> _pipe@18 = Sb, oaspec@internal@util@string_extra:indent( _pipe@18, Indent, <<"Some(token) -> request.set_header(req, \"authorization\", \"Digest \" <> token)"/utf8>> ); {ok, {value, {http_scheme, <<"bearer"/utf8>>, _}}} -> _pipe@19 = Sb, oaspec@internal@util@string_extra:indent( _pipe@19, Indent, <<"Some(token) -> request.set_header(req, \"authorization\", \"Bearer \" <> token)"/utf8>> ); {ok, {value, {o_auth2_scheme, _, _}}} -> _pipe@19 = Sb, oaspec@internal@util@string_extra:indent( _pipe@19, Indent, <<"Some(token) -> request.set_header(req, \"authorization\", \"Bearer \" <> token)"/utf8>> ); {ok, {value, {open_id_connect_scheme, _, _}}} -> _pipe@19 = Sb, oaspec@internal@util@string_extra:indent( _pipe@19, Indent, <<"Some(token) -> request.set_header(req, \"authorization\", \"Bearer \" <> token)"/utf8>> ); {ok, {value, {http_scheme, Scheme_name, _}}} -> _pipe@20 = Sb, oaspec@internal@util@string_extra:indent( _pipe@20, Indent, <<<<"Some(token) -> request.set_header(req, \"authorization\", \""/utf8, (capitalize_first(Scheme_name))/binary>>/binary, " \" <> token)"/utf8>> ); _ -> Sb end; _ -> Sb end. -file("src/oaspec/internal/codegen/client_security.gleam", 283). ?DOC(false). -spec generate_scheme_apply( gleam@string_tree:string_tree(), oaspec@internal@codegen@context:context(), oaspec@internal@openapi@spec:security_scheme_ref(), binary(), integer() ) -> gleam@string_tree:string_tree(). generate_scheme_apply(Sb, Ctx, Scheme_ref, Val_var, Indent) -> case erlang:element(5, oaspec@internal@codegen@context:spec(Ctx)) of {some, Components} -> case gleam_stdlib:map_get( erlang:element(6, Components), erlang:element(2, Scheme_ref) ) of {ok, {value, {api_key_scheme, Header_name, scheme_in_header}}} -> _pipe = Sb, oaspec@internal@util@string_extra:indent( _pipe, Indent, <<<<<<<<"let req = request.set_header(req, \""/utf8, (string:lowercase(Header_name))/binary>>/binary, "\", "/utf8>>/binary, Val_var/binary>>/binary, ")"/utf8>> ); {ok, {value, {api_key_scheme, Query_name, scheme_in_query}}} -> _pipe@1 = Sb, _pipe@2 = oaspec@internal@util@string_extra:indent( _pipe@1, Indent, <<"let sep = case string.contains(req.path, \"?\") {"/utf8>> ), _pipe@3 = oaspec@internal@util@string_extra:indent( _pipe@2, Indent + 1, <<"True -> \"&\""/utf8>> ), _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, Indent + 1, <<"False -> \"?\""/utf8>> ), _pipe@5 = oaspec@internal@util@string_extra:indent( _pipe@4, Indent, <<"}"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@5, Indent, <<<<<<<<"let req = request.Request(..req, path: req.path <> sep <> \""/utf8, Query_name/binary>>/binary, "=\" <> "/utf8>>/binary, Val_var/binary>>/binary, ")"/utf8>> ); {ok, {value, {api_key_scheme, Cookie_name, scheme_in_cookie}}} -> _pipe@6 = Sb, _pipe@7 = oaspec@internal@util@string_extra:indent( _pipe@6, Indent, <<"let existing = list.key_find(req.headers, \"cookie\") |> result.unwrap(\"\")"/utf8>> ), _pipe@8 = oaspec@internal@util@string_extra:indent( _pipe@7, Indent, <<<<<<"let cookie_val = \""/utf8, Cookie_name/binary>>/binary, "=\" <> "/utf8>>/binary, Val_var/binary>> ), _pipe@9 = oaspec@internal@util@string_extra:indent( _pipe@8, Indent, <<"let new_cookie = case existing {"/utf8>> ), _pipe@10 = oaspec@internal@util@string_extra:indent( _pipe@9, Indent + 1, <<"\"\" -> cookie_val"/utf8>> ), _pipe@11 = oaspec@internal@util@string_extra:indent( _pipe@10, Indent + 1, <<"_ -> existing <> \"; \" <> cookie_val"/utf8>> ), _pipe@12 = oaspec@internal@util@string_extra:indent( _pipe@11, Indent, <<"}"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@12, Indent, <<"let req = request.set_header(req, \"cookie\", new_cookie)"/utf8>> ); {ok, {value, {http_scheme, <<"basic"/utf8>>, _}}} -> _pipe@13 = Sb, oaspec@internal@util@string_extra:indent( _pipe@13, Indent, <<<<"let req = request.set_header(req, \"authorization\", \"Basic \" <> "/utf8, Val_var/binary>>/binary, ")"/utf8>> ); {ok, {value, {http_scheme, <<"digest"/utf8>>, _}}} -> _pipe@14 = Sb, oaspec@internal@util@string_extra:indent( _pipe@14, Indent, <<<<"let req = request.set_header(req, \"authorization\", \"Digest \" <> "/utf8, Val_var/binary>>/binary, ")"/utf8>> ); {ok, {value, {http_scheme, <<"bearer"/utf8>>, _}}} -> _pipe@15 = Sb, oaspec@internal@util@string_extra:indent( _pipe@15, Indent, <<<<"let req = request.set_header(req, \"authorization\", \"Bearer \" <> "/utf8, Val_var/binary>>/binary, ")"/utf8>> ); {ok, {value, {o_auth2_scheme, _, _}}} -> _pipe@15 = Sb, oaspec@internal@util@string_extra:indent( _pipe@15, Indent, <<<<"let req = request.set_header(req, \"authorization\", \"Bearer \" <> "/utf8, Val_var/binary>>/binary, ")"/utf8>> ); {ok, {value, {open_id_connect_scheme, _, _}}} -> _pipe@15 = Sb, oaspec@internal@util@string_extra:indent( _pipe@15, Indent, <<<<"let req = request.set_header(req, \"authorization\", \"Bearer \" <> "/utf8, Val_var/binary>>/binary, ")"/utf8>> ); {ok, {value, {http_scheme, Scheme_name, _}}} -> _pipe@16 = Sb, oaspec@internal@util@string_extra:indent( _pipe@16, Indent, <<<<<<<<"let req = request.set_header(req, \"authorization\", \""/utf8, (capitalize_first(Scheme_name))/binary>>/binary, " \" <> "/utf8>>/binary, Val_var/binary>>/binary, ")"/utf8>> ); _ -> Sb end; _ -> Sb end. -file("src/oaspec/internal/codegen/client_security.gleam", 114). ?DOC(false). -spec generate_security_alternative( gleam@string_tree:string_tree(), oaspec@internal@codegen@context:context(), list(oaspec@internal@openapi@spec:security_scheme_ref()), integer(), binary() ) -> gleam@string_tree:string_tree(). generate_security_alternative(Sb, Ctx, Schemes, Base_indent, Fallback) -> case Schemes of [] -> Sb; [Single_scheme] -> Field_name = oaspec@internal@util@naming:to_snake_case( erlang:element(2, Single_scheme) ), Sb@1 = begin _pipe = Sb, oaspec@internal@util@string_extra:indent( _pipe, Base_indent, <<<<"let req = case config."/utf8, Field_name/binary>>/binary, " {"/utf8>> ) end, Sb@2 = generate_scheme_some_branch( Sb@1, Ctx, Single_scheme, Base_indent + 1 ), _pipe@1 = Sb@2, _pipe@2 = oaspec@internal@util@string_extra:indent( _pipe@1, Base_indent + 1, <<"None -> "/utf8, Fallback/binary>> ), oaspec@internal@util@string_extra:indent( _pipe@2, Base_indent, <<"}"/utf8>> ); Schemes@1 -> Fields = gleam@list:map( Schemes@1, fun(S) -> <<"config."/utf8, (oaspec@internal@util@naming:to_snake_case( erlang:element(2, S) ))/binary>> end ), Sb@3 = begin _pipe@3 = Sb, oaspec@internal@util@string_extra:indent( _pipe@3, Base_indent, <<<<"let req = case "/utf8, (gleam@string:join(Fields, <<", "/utf8>>))/binary>>/binary, " {"/utf8>> ) end, Some_patterns = gleam@list:map( Schemes@1, fun(S@1) -> <<<<"Some("/utf8, (oaspec@internal@util@naming:to_snake_case( erlang:element(2, S@1) ))/binary>>/binary, "_val)"/utf8>> end ), Sb@4 = begin _pipe@4 = Sb@3, oaspec@internal@util@string_extra:indent( _pipe@4, Base_indent + 1, <<(gleam@string:join(Some_patterns, <<", "/utf8>>))/binary, " -> {"/utf8>> ) end, Sb@6 = gleam@list:fold( Schemes@1, Sb@4, fun(Sb@5, Scheme_ref) -> generate_scheme_apply( Sb@5, Ctx, Scheme_ref, <<(oaspec@internal@util@naming:to_snake_case( erlang:element(2, Scheme_ref) ))/binary, "_val"/utf8>>, Base_indent + 2 ) end ), Sb@7 = begin _pipe@5 = Sb@6, _pipe@6 = oaspec@internal@util@string_extra:indent( _pipe@5, Base_indent + 2, <<"req"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@6, Base_indent + 1, <<"}"/utf8>> ) end, Wildcard = begin _pipe@7 = gleam@list:map(Schemes@1, fun(_) -> <<"_"/utf8>> end), gleam@string:join(_pipe@7, <<", "/utf8>>) end, _pipe@8 = Sb@7, _pipe@9 = oaspec@internal@util@string_extra:indent( _pipe@8, Base_indent + 1, <<< "/utf8>>/binary, Fallback/binary>> ), oaspec@internal@util@string_extra:indent( _pipe@9, Base_indent, <<"}"/utf8>> ) end. -file("src/oaspec/internal/codegen/client_security.gleam", 23). ?DOC(false). -spec generate_security_or_chain( gleam@string_tree:string_tree(), oaspec@internal@codegen@context:context(), list(oaspec@internal@openapi@spec:security_requirement()), integer() ) -> gleam@string_tree:string_tree(). generate_security_or_chain(Sb, Ctx, Alternatives, Base_indent) -> case Alternatives of [] -> Sb; [Alt] -> generate_security_alternative( Sb, Ctx, erlang:element(2, Alt), Base_indent, <<"req"/utf8>> ); [Alt@1 | Rest] -> case erlang:element(2, Alt@1) of [] -> generate_security_or_chain(Sb, Ctx, Rest, Base_indent); [Single_scheme] -> Field_name = oaspec@internal@util@naming:to_snake_case( erlang:element(2, Single_scheme) ), Sb@1 = begin _pipe = Sb, oaspec@internal@util@string_extra:indent( _pipe, Base_indent, <<<<"let req = case config."/utf8, Field_name/binary>>/binary, " {"/utf8>> ) end, Sb@2 = generate_scheme_some_branch( Sb@1, Ctx, Single_scheme, Base_indent + 1 ), Sb@3 = begin _pipe@1 = Sb@2, oaspec@internal@util@string_extra:indent( _pipe@1, Base_indent + 1, <<"None -> {"/utf8>> ) end, Sb@4 = generate_security_or_chain( Sb@3, Ctx, Rest, Base_indent + 2 ), _pipe@2 = Sb@4, _pipe@3 = oaspec@internal@util@string_extra:indent( _pipe@2, Base_indent + 2, <<"req"/utf8>> ), _pipe@4 = oaspec@internal@util@string_extra:indent( _pipe@3, Base_indent + 1, <<"}"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@4, Base_indent, <<"}"/utf8>> ); Schemes -> Fields = gleam@list:map( Schemes, fun(S) -> <<"config."/utf8, (oaspec@internal@util@naming:to_snake_case( erlang:element(2, S) ))/binary>> end ), Sb@5 = begin _pipe@5 = Sb, oaspec@internal@util@string_extra:indent( _pipe@5, Base_indent, <<<<"let req = case "/utf8, (gleam@string:join(Fields, <<", "/utf8>>))/binary>>/binary, " {"/utf8>> ) end, Some_patterns = gleam@list:map( Schemes, fun(S@1) -> <<<<"Some("/utf8, (oaspec@internal@util@naming:to_snake_case( erlang:element(2, S@1) ))/binary>>/binary, "_val)"/utf8>> end ), Sb@6 = begin _pipe@6 = Sb@5, oaspec@internal@util@string_extra:indent( _pipe@6, Base_indent + 1, <<(gleam@string:join(Some_patterns, <<", "/utf8>>))/binary, " -> {"/utf8>> ) end, Sb@8 = gleam@list:fold( Schemes, Sb@6, fun(Sb@7, Scheme_ref) -> generate_scheme_apply( Sb@7, Ctx, Scheme_ref, <<(oaspec@internal@util@naming:to_snake_case( erlang:element(2, Scheme_ref) ))/binary, "_val"/utf8>>, Base_indent + 2 ) end ), Sb@9 = begin _pipe@7 = Sb@8, _pipe@8 = oaspec@internal@util@string_extra:indent( _pipe@7, Base_indent + 2, <<"req"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@8, Base_indent + 1, <<"}"/utf8>> ) end, Wildcard = begin _pipe@9 = gleam@list:map( Schemes, fun(_) -> <<"_"/utf8>> end ), gleam@string:join(_pipe@9, <<", "/utf8>>) end, Sb@10 = begin _pipe@10 = Sb@9, oaspec@internal@util@string_extra:indent( _pipe@10, Base_indent + 1, < {"/utf8>> ) end, Sb@11 = generate_security_or_chain( Sb@10, Ctx, Rest, Base_indent + 2 ), _pipe@11 = Sb@11, _pipe@12 = oaspec@internal@util@string_extra:indent( _pipe@11, Base_indent + 2, <<"req"/utf8>> ), _pipe@13 = oaspec@internal@util@string_extra:indent( _pipe@12, Base_indent + 1, <<"}"/utf8>> ), oaspec@internal@util@string_extra:indent( _pipe@13, Base_indent, <<"}"/utf8>> ) end end. -file("src/oaspec/internal/codegen/client_security.gleam", 391). ?DOC(false). -spec maybe_percent_encode( binary(), oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved()) ) -> binary(). maybe_percent_encode(Value_expr, Param) -> gleam@bool:guard( erlang:element(10, Param), Value_expr, fun() -> <<<<"uri.percent_encode("/utf8, Value_expr/binary>>/binary, ")"/utf8>> end ).