-module(oaspec@internal@codegen@context). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/oaspec/internal/codegen/context.gleam"). -export([spec/1, config/1, operations/1, analyzed_schemas/1, resolve_schema_ref/2, schema_metadata/2, new/2]). -export_type([analyzed_schema/0, context/0, file_target/0, write_mode/0, generated_file/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(false). -type analyzed_schema() :: {analyzed_schema, binary(), binary(), {ok, oaspec@internal@openapi@schema:schema_object()} | {error, oaspec@internal@openapi@resolver:resolve_error()}}. -opaque context() :: {context, oaspec@internal@openapi@spec:open_api_spec(oaspec@internal@openapi@spec:resolved()), oaspec@config:config(), list({binary(), oaspec@internal@openapi@spec:operation(oaspec@internal@openapi@spec:resolved()), binary(), oaspec@internal@openapi@spec:http_method()}), gleam@dict:dict(binary(), {ok, oaspec@internal@openapi@schema:schema_object()} | {error, oaspec@internal@openapi@resolver:resolve_error()}), list(analyzed_schema())}. -type file_target() :: shared_target | server_target | client_target. -type write_mode() :: overwrite | skip_if_exists. -type generated_file() :: {generated_file, binary(), binary(), file_target(), write_mode()}. -file("src/oaspec/internal/codegen/context.gleam", 70). ?DOC(false). -spec spec(context()) -> oaspec@internal@openapi@spec:open_api_spec(oaspec@internal@openapi@spec:resolved()). spec(Ctx) -> erlang:element(2, Ctx). -file("src/oaspec/internal/codegen/context.gleam", 75). ?DOC(false). -spec config(context()) -> oaspec@config:config(). config(Ctx) -> erlang:element(3, Ctx). -file("src/oaspec/internal/codegen/context.gleam", 82). ?DOC(false). -spec operations(context()) -> list({binary(), oaspec@internal@openapi@spec:operation(oaspec@internal@openapi@spec:resolved()), binary(), oaspec@internal@openapi@spec:http_method()}). operations(Ctx) -> erlang:element(4, Ctx). -file("src/oaspec/internal/codegen/context.gleam", 88). ?DOC(false). -spec analyzed_schemas(context()) -> list(analyzed_schema()). analyzed_schemas(Ctx) -> erlang:element(6, Ctx). -file("src/oaspec/internal/codegen/context.gleam", 97). ?DOC(false). -spec resolve_schema_ref(oaspec@internal@openapi@schema:schema_ref(), context()) -> {ok, oaspec@internal@openapi@schema:schema_object()} | {error, oaspec@internal@openapi@resolver:resolve_error()}. resolve_schema_ref(Schema_ref, Ctx) -> case Schema_ref of {inline, Schema_obj} -> {ok, Schema_obj}; {reference, Ref, _} -> case gleam_stdlib:map_get(erlang:element(5, Ctx), Ref) of {ok, Resolved} -> Resolved; {error, _} -> oaspec@internal@openapi@resolver:resolve_schema_ref( Schema_ref, erlang:element(2, Ctx) ) end end. -file("src/oaspec/internal/codegen/context.gleam", 113). ?DOC(false). -spec schema_metadata(oaspec@internal@openapi@schema:schema_ref(), context()) -> gleam@option:option(oaspec@internal@openapi@schema:schema_metadata()). schema_metadata(Schema_ref, Ctx) -> case resolve_schema_ref(Schema_ref, Ctx) of {ok, Schema_obj} -> {some, oaspec@internal@openapi@schema:get_metadata(Schema_obj)}; {error, _} -> none end. -file("src/oaspec/internal/codegen/context.gleam", 142). ?DOC(false). -spec build_schema_cache(list(analyzed_schema())) -> gleam@dict:dict(binary(), {ok, oaspec@internal@openapi@schema:schema_object()} | {error, oaspec@internal@openapi@resolver:resolve_error()}). build_schema_cache(Analyzed_schemas) -> gleam@list:fold( Analyzed_schemas, maps:new(), fun(Acc, Entry) -> gleam@dict:insert( Acc, erlang:element(3, Entry), erlang:element(4, Entry) ) end ). -file("src/oaspec/internal/codegen/context.gleam", 150). ?DOC(false). -spec component_schema_ref(binary()) -> binary(). component_schema_ref(Name) -> <<"#/components/schemas/"/utf8, Name/binary>>. -file("src/oaspec/internal/codegen/context.gleam", 124). ?DOC(false). -spec collect_analyzed_schemas( oaspec@internal@openapi@spec:open_api_spec(oaspec@internal@openapi@spec:resolved()) ) -> list(analyzed_schema()). collect_analyzed_schemas(Spec) -> case erlang:element(5, Spec) of {some, Components} -> _pipe = maps:to_list(erlang:element(2, Components)), _pipe@1 = gleam@list:sort( _pipe, fun(A, B) -> gleam@string:compare( erlang:element(1, A), erlang:element(1, B) ) end ), gleam@list:map( _pipe@1, fun(Entry) -> {Name, _} = Entry, Ref = component_schema_ref(Name), {analyzed_schema, Name, Ref, oaspec@internal@openapi@resolver:resolve_schema_ref( {reference, Ref, Name}, Spec )} end ); none -> [] end. -file("src/oaspec/internal/codegen/context.gleam", 57). ?DOC(false). -spec new( oaspec@internal@openapi@spec:open_api_spec(oaspec@internal@openapi@spec:resolved()), oaspec@config:config() ) -> context(). new(Spec, Config) -> Analyzed_schemas = collect_analyzed_schemas(Spec), Schema_cache = build_schema_cache(Analyzed_schemas), {context, Spec, Config, oaspec@internal@openapi@operations:collect_operations(Spec), Schema_cache, Analyzed_schemas}.