Current section

Files

Jump to
oaspec src oaspec@internal@openapi@reachability.erl
Raw

src/oaspec@internal@openapi@reachability.erl

-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.