-module(oaspec@openapi@resolver). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/oaspec/openapi/resolver.gleam"). -export([ref_to_name/1, resolve_schema_ref/2]). -export_type([resolve_error/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. -type resolve_error() :: {unresolved_ref, binary()} | {circular_ref, binary()}. -file("src/oaspec/openapi/resolver.gleam", 20). ?DOC( " Resolve a $ref string to its schema name.\n" " Example: \"#/components/schemas/User\" -> \"User\"\n" ). -spec ref_to_name(binary()) -> binary(). ref_to_name(Ref) -> _pipe = Ref, _pipe@1 = gleam@string:split(_pipe, <<"/"/utf8>>), _pipe@2 = gleam@list:last(_pipe@1), gleam@result:unwrap(_pipe@2, <<"Unknown"/utf8>>). -file("src/oaspec/openapi/resolver.gleam", 37). ?DOC(" Internal resolver that tracks visited refs for cycle detection.\n"). -spec resolve_schema_ref_with_seen( oaspec@openapi@schema:schema_ref(), oaspec@openapi@spec:open_api_spec(oaspec@openapi@spec:resolved()), gleam@set:set(binary()) ) -> {ok, oaspec@openapi@schema:schema_object()} | {error, resolve_error()}. resolve_schema_ref_with_seen(Schema_ref, Spec, Seen) -> case Schema_ref of {inline, Schema} -> {ok, Schema}; {reference, Ref, Name} -> case gleam@set:contains(Seen, Ref) of true -> {error, {circular_ref, Ref}}; false -> New_seen = gleam@set:insert(Seen, Ref), case erlang:element(5, Spec) of {some, Components} -> case gleam_stdlib:map_get( erlang:element(2, Components), Name ) of {ok, {inline, Schema@1}} -> {ok, Schema@1}; {ok, {reference, Inner_ref, Inner_name}} -> resolve_schema_ref_with_seen( {reference, Inner_ref, Inner_name}, Spec, New_seen ); {error, _} -> {error, {unresolved_ref, Ref}} end; none -> {error, {unresolved_ref, Ref}} end end end. -file("src/oaspec/openapi/resolver.gleam", 29). ?DOC( " Resolve a SchemaRef to a SchemaObject, looking up $ref in components.\n" " Tracks seen refs to detect circular references.\n" ). -spec resolve_schema_ref( oaspec@openapi@schema:schema_ref(), oaspec@openapi@spec:open_api_spec(oaspec@openapi@spec:resolved()) ) -> {ok, oaspec@openapi@schema:schema_object()} | {error, resolve_error()}. resolve_schema_ref(Schema_ref, Spec) -> resolve_schema_ref_with_seen(Schema_ref, Spec, gleam@set:new()).