Packages
oaspec
0.19.0
0.68.0
0.67.0
0.66.0
0.65.0
0.64.0
0.63.0
0.62.0
0.61.0
0.60.0
0.59.0
0.58.1
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.3
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.1.3
Generate Gleam code from OpenAPI 3.x specifications
Current section
Files
Jump to
Current section
Files
src/oaspec@openapi@provenance.erl
-module(oaspec@openapi@provenance).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/oaspec/openapi/provenance.gleam").
-export([total_hoisted/1, hoisted_schema_summary/1]).
-export_type([hoisted_summary/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(
" Summarise the provenance of component schemas after the hoist pass has\n"
" run. Distinguishing user-authored schemas from synthetic ones created\n"
" during hoisting lets tooling explain where each generated type came from.\n"
).
-type hoisted_summary() :: {hoisted_summary,
list(binary()),
list({binary(), binary(), binary()}),
list({binary(), binary()}),
list({binary(), binary(), integer()}),
list({binary(), binary(), integer()}),
list({binary(), binary(), integer()}),
list({binary(), binary()}),
list({binary(), binary(), binary()}),
list({binary(), binary(), binary()}),
list({binary(), binary()})}.
-file("src/oaspec/openapi/provenance.gleam", 32).
?DOC(" Total number of synthetic schemas that were created during hoisting.\n").
-spec total_hoisted(hoisted_summary()) -> integer().
total_hoisted(Summary) ->
(((((((erlang:length(erlang:element(3, Summary)) + erlang:length(
erlang:element(4, Summary)
))
+ erlang:length(erlang:element(5, Summary)))
+ erlang:length(erlang:element(6, Summary)))
+ erlang:length(erlang:element(7, Summary)))
+ erlang:length(erlang:element(8, Summary)))
+ erlang:length(erlang:element(9, Summary)))
+ erlang:length(erlang:element(10, Summary)))
+ erlang:length(erlang:element(11, Summary)).
-file("src/oaspec/openapi/provenance.gleam", 47).
?DOC(
" Walk component schemas and group them by provenance. Reference-only\n"
" entries (rare after resolve) are ignored because they carry no\n"
" metadata of their own.\n"
).
-spec hoisted_schema_summary(oaspec@openapi@spec:open_api_spec(any())) -> hoisted_summary().
hoisted_schema_summary(Spec) ->
Empty = {hoisted_summary, [], [], [], [], [], [], [], [], [], []},
Schemas = case erlang:element(5, Spec) of
{some, Components} ->
erlang:element(2, Components);
none ->
maps:new()
end,
_pipe = maps:to_list(Schemas),
gleam@list:fold(
_pipe,
Empty,
fun(Acc, Entry) ->
{Name, Schema_ref} = Entry,
case Schema_ref of
{inline, Obj} ->
case oaspec@openapi@schema:get_provenance(Obj) of
user_authored ->
{hoisted_summary,
[Name | erlang:element(2, Acc)],
erlang:element(3, Acc),
erlang:element(4, Acc),
erlang:element(5, Acc),
erlang:element(6, Acc),
erlang:element(7, Acc),
erlang:element(8, Acc),
erlang:element(9, Acc),
erlang:element(10, Acc),
erlang:element(11, Acc)};
{hoisted_property, Parent, Property} ->
{hoisted_summary,
erlang:element(2, Acc),
[{Name, Parent, Property} |
erlang:element(3, Acc)],
erlang:element(4, Acc),
erlang:element(5, Acc),
erlang:element(6, Acc),
erlang:element(7, Acc),
erlang:element(8, Acc),
erlang:element(9, Acc),
erlang:element(10, Acc),
erlang:element(11, Acc)};
{hoisted_array_item, Parent@1} ->
{hoisted_summary,
erlang:element(2, Acc),
erlang:element(3, Acc),
[{Name, Parent@1} | erlang:element(4, Acc)],
erlang:element(5, Acc),
erlang:element(6, Acc),
erlang:element(7, Acc),
erlang:element(8, Acc),
erlang:element(9, Acc),
erlang:element(10, Acc),
erlang:element(11, Acc)};
{hoisted_one_of_variant, Parent@2, Index} ->
{hoisted_summary,
erlang:element(2, Acc),
erlang:element(3, Acc),
erlang:element(4, Acc),
[{Name, Parent@2, Index} |
erlang:element(5, Acc)],
erlang:element(6, Acc),
erlang:element(7, Acc),
erlang:element(8, Acc),
erlang:element(9, Acc),
erlang:element(10, Acc),
erlang:element(11, Acc)};
{hoisted_any_of_variant, Parent@3, Index@1} ->
{hoisted_summary,
erlang:element(2, Acc),
erlang:element(3, Acc),
erlang:element(4, Acc),
erlang:element(5, Acc),
[{Name, Parent@3, Index@1} |
erlang:element(6, Acc)],
erlang:element(7, Acc),
erlang:element(8, Acc),
erlang:element(9, Acc),
erlang:element(10, Acc),
erlang:element(11, Acc)};
{hoisted_all_of_part, Parent@4, Index@2} ->
{hoisted_summary,
erlang:element(2, Acc),
erlang:element(3, Acc),
erlang:element(4, Acc),
erlang:element(5, Acc),
erlang:element(6, Acc),
[{Name, Parent@4, Index@2} |
erlang:element(7, Acc)],
erlang:element(8, Acc),
erlang:element(9, Acc),
erlang:element(10, Acc),
erlang:element(11, Acc)};
{hoisted_request_body, Operation_id} ->
{hoisted_summary,
erlang:element(2, Acc),
erlang:element(3, Acc),
erlang:element(4, Acc),
erlang:element(5, Acc),
erlang:element(6, Acc),
erlang:element(7, Acc),
[{Name, Operation_id} | erlang:element(8, Acc)],
erlang:element(9, Acc),
erlang:element(10, Acc),
erlang:element(11, Acc)};
{hoisted_response, Operation_id@1, Status} ->
{hoisted_summary,
erlang:element(2, Acc),
erlang:element(3, Acc),
erlang:element(4, Acc),
erlang:element(5, Acc),
erlang:element(6, Acc),
erlang:element(7, Acc),
erlang:element(8, Acc),
[{Name, Operation_id@1, Status} |
erlang:element(9, Acc)],
erlang:element(10, Acc),
erlang:element(11, Acc)};
{hoisted_parameter, Operation_id@2, Param_name} ->
{hoisted_summary,
erlang:element(2, Acc),
erlang:element(3, Acc),
erlang:element(4, Acc),
erlang:element(5, Acc),
erlang:element(6, Acc),
erlang:element(7, Acc),
erlang:element(8, Acc),
erlang:element(9, Acc),
[{Name, Operation_id@2, Param_name} |
erlang:element(10, Acc)],
erlang:element(11, Acc)};
{hoisted_additional_properties, Parent@5} ->
{hoisted_summary,
erlang:element(2, Acc),
erlang:element(3, Acc),
erlang:element(4, Acc),
erlang:element(5, Acc),
erlang:element(6, Acc),
erlang:element(7, Acc),
erlang:element(8, Acc),
erlang:element(9, Acc),
erlang:element(10, Acc),
[{Name, Parent@5} | erlang:element(11, Acc)]}
end;
_ ->
Acc
end
end
).