-module(oaspec@internal@openapi@reachability). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/oaspec/internal/openapi/reachability.gleam"). -export([prune/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/openapi/reachability.gleam", 156). ?DOC(false). -spec refs_from_media_dict( gleam@dict:dict(binary(), oaspec@internal@openapi@spec:media_type()) ) -> list(oaspec@internal@openapi@schema:schema_ref()). refs_from_media_dict(Content) -> _pipe = maps:values(Content), gleam@list:filter_map( _pipe, fun(Mt) -> gleam@option:to_result(erlang:element(2, Mt), nil) end ). -file("src/oaspec/internal/openapi/reachability.gleam", 137). ?DOC(false). -spec refs_from_parameter_ref( oaspec@internal@openapi@spec:ref_or(oaspec@internal@openapi@spec:parameter(oaspec@internal@openapi@spec:resolved())) ) -> list(oaspec@internal@openapi@schema:schema_ref()). refs_from_parameter_ref(Pref) -> case Pref of {value, P} -> case erlang:element(6, P) of {parameter_schema, S} -> [S]; {parameter_content, Content} -> refs_from_media_dict(Content) end; {ref, _} -> [] end. -file("src/oaspec/internal/openapi/reachability.gleam", 148). ?DOC(false). -spec refs_from_response( oaspec@internal@openapi@spec:response(oaspec@internal@openapi@spec:resolved()) ) -> list(oaspec@internal@openapi@schema:schema_ref()). refs_from_response(R) -> Content_refs = refs_from_media_dict(erlang:element(3, R)), Header_refs = begin _pipe = maps:values(erlang:element(4, R)), gleam@list:filter_map( _pipe, fun(H) -> gleam@option:to_result(erlang:element(4, H), nil) end ) end, lists:append([Content_refs, Header_refs]). -file("src/oaspec/internal/openapi/reachability.gleam", 225). ?DOC(false). -spec discriminator_mapping_refs( gleam@option:option(oaspec@internal@openapi@schema:discriminator()) ) -> list(oaspec@internal@openapi@schema:schema_ref()). discriminator_mapping_refs(Discriminator) -> case Discriminator of {some, D} -> _pipe = maps:values(erlang:element(3, D)), gleam@list:map( _pipe, fun oaspec@internal@openapi@schema:make_reference/1 ); none -> [] end. -file("src/oaspec/internal/openapi/reachability.gleam", 201). ?DOC(false). -spec refs_from_schema_object(oaspec@internal@openapi@schema:schema_object()) -> list(oaspec@internal@openapi@schema:schema_ref()). refs_from_schema_object(Schema) -> case Schema of {object_schema, _, Properties, _, Additional_properties, _, _} -> Prop_refs = maps:values(Properties), Ap_refs = case Additional_properties of {typed, S} -> [S]; forbidden -> []; untyped -> []; unspecified -> [] end, lists:append([Prop_refs, Ap_refs]); {array_schema, _, Items, _, _, _} -> [Items]; {all_of_schema, _, Schemas} -> Schemas; {one_of_schema, _, Schemas@1, Discriminator} -> lists:append([Schemas@1, discriminator_mapping_refs(Discriminator)]); {any_of_schema, _, Schemas@2, Discriminator@1} -> lists:append( [Schemas@2, discriminator_mapping_refs(Discriminator@1)] ); _ -> [] end. -file("src/oaspec/internal/openapi/reachability.gleam", 164). ?DOC(false). -spec walk( list(oaspec@internal@openapi@schema:schema_ref()), gleam@dict:dict(binary(), nil), gleam@dict:dict(binary(), oaspec@internal@openapi@schema:schema_ref()) ) -> gleam@dict:dict(binary(), nil). walk(Worklist, Reached, Schemas) -> case Worklist of [] -> Reached; [Ref | Rest] -> case Ref of {reference, _, Name} -> case gleam@dict:has_key(Reached, Name) of true -> walk(Rest, Reached, Schemas); false -> Reached@1 = gleam@dict:insert(Reached, Name, nil), case gleam_stdlib:map_get(Schemas, Name) of {ok, Target} -> walk([Target | Rest], Reached@1, Schemas); {error, nil} -> walk(Rest, Reached@1, Schemas) end end; {inline, Obj} -> Children = refs_from_schema_object(Obj), walk(lists:append(Children, Rest), Reached, Schemas) end end. -file("src/oaspec/internal/openapi/reachability.gleam", 128). ?DOC(false). -spec refs_from_callback_ref( oaspec@internal@openapi@spec:ref_or(oaspec@internal@openapi@spec:callback(oaspec@internal@openapi@spec:resolved())) ) -> list(oaspec@internal@openapi@schema:schema_ref()). refs_from_callback_ref(Cb_ref) -> case Cb_ref of {value, {callback, Entries}} -> _pipe = maps:values(Entries), gleam@list:flat_map(_pipe, fun refs_from_path_ref/1); {ref, _} -> [] end. -file("src/oaspec/internal/openapi/reachability.gleam", 82). ?DOC(false). -spec refs_from_path_ref( oaspec@internal@openapi@spec:ref_or(oaspec@internal@openapi@spec:path_item(oaspec@internal@openapi@spec:resolved())) ) -> list(oaspec@internal@openapi@schema:schema_ref()). refs_from_path_ref(Path_ref) -> case Path_ref of {value, Item} -> refs_from_path_item(Item); {ref, _} -> [] end. -file("src/oaspec/internal/openapi/reachability.gleam", 89). ?DOC(false). -spec refs_from_path_item( oaspec@internal@openapi@spec:path_item(oaspec@internal@openapi@spec:resolved()) ) -> list(oaspec@internal@openapi@schema:schema_ref()). refs_from_path_item(Item) -> Path_param_refs = gleam@list:flat_map( erlang:element(12, Item), fun refs_from_parameter_ref/1 ), Op_refs = begin _pipe = [erlang:element(4, Item), erlang:element(5, Item), erlang:element(6, Item), erlang:element(7, Item), erlang:element(8, Item), erlang:element(9, Item), erlang:element(10, Item), erlang:element(11, Item)], _pipe@1 = gleam@list:filter_map( _pipe, fun(_capture) -> gleam@option:to_result(_capture, nil) end ), gleam@list:flat_map(_pipe@1, fun refs_from_operation/1) end, lists:append([Path_param_refs, Op_refs]). -file("src/oaspec/internal/openapi/reachability.gleam", 107). ?DOC(false). -spec refs_from_operation( oaspec@internal@openapi@spec:operation(oaspec@internal@openapi@spec:resolved()) ) -> list(oaspec@internal@openapi@schema:schema_ref()). refs_from_operation(Op) -> Parameter_refs = gleam@list:flat_map( erlang:element(6, Op), fun refs_from_parameter_ref/1 ), Body_refs = case erlang:element(7, Op) of {some, {value, Rb}} -> refs_from_media_dict(erlang:element(3, Rb)); {some, {ref, _}} -> []; none -> [] end, Response_refs = begin _pipe = maps:values(erlang:element(8, Op)), gleam@list:flat_map(_pipe, fun(Rr) -> case Rr of {value, R} -> refs_from_response(R); {ref, _} -> [] end end) end, Callback_refs = begin _pipe@1 = maps:values(erlang:element(11, Op)), gleam@list:flat_map(_pipe@1, fun refs_from_callback_ref/1) end, lists:append([Parameter_refs, Body_refs, Response_refs, Callback_refs]). -file("src/oaspec/internal/openapi/reachability.gleam", 72). ?DOC(false). -spec collect_seed_refs( oaspec@internal@openapi@spec:open_api_spec(oaspec@internal@openapi@spec:resolved()) ) -> list(oaspec@internal@openapi@schema:schema_ref()). collect_seed_refs(Spec) -> Path_refs = begin _pipe = maps:values(erlang:element(4, Spec)), gleam@list:flat_map(_pipe, fun refs_from_path_ref/1) end, Webhook_refs = begin _pipe@1 = maps:values(erlang:element(8, Spec)), gleam@list:flat_map(_pipe@1, fun refs_from_path_ref/1) end, lists:append([Path_refs, Webhook_refs]). -file("src/oaspec/internal/openapi/reachability.gleam", 50). ?DOC(false). -spec prune( oaspec@internal@openapi@spec:open_api_spec(oaspec@internal@openapi@spec:resolved()) ) -> oaspec@internal@openapi@spec:open_api_spec(oaspec@internal@openapi@spec:resolved()). prune(Spec) -> case erlang:element(5, Spec) of none -> Spec; {some, Components} -> Seeds = collect_seed_refs(Spec), Reached = walk(Seeds, maps:new(), erlang:element(2, Components)), Pruned_schemas = begin _pipe = erlang:element(2, Components), _pipe@1 = maps:to_list(_pipe), _pipe@2 = gleam@list:filter( _pipe@1, fun(Entry) -> gleam@dict:has_key(Reached, erlang:element(1, Entry)) end ), maps:from_list(_pipe@2) end, {open_api_spec, erlang:element(2, Spec), erlang:element(3, Spec), erlang:element(4, Spec), {some, {components, Pruned_schemas, erlang:element(3, Components), erlang:element(4, Components), erlang:element(5, Components), erlang:element(6, Components), erlang:element(7, Components), erlang:element(8, Components), erlang:element(9, Components), erlang:element(10, Components), erlang:element(11, Components)}}, erlang:element(6, Spec), erlang:element(7, Spec), erlang:element(8, Spec), erlang:element(9, Spec), erlang:element(10, Spec), erlang:element(11, Spec)} end.