Packages
oaspec
0.23.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@codegen@allof_merge.erl
-module(oaspec@codegen@allof_merge).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/oaspec/codegen/allof_merge.gleam").
-export([merge_allof_schemas/2]).
-export_type([merged_all_of/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 merged_all_of() :: {merged_all_of,
gleam@dict:dict(binary(), oaspec@openapi@schema:schema_ref()),
list(binary()),
oaspec@openapi@schema:additional_properties()}.
-file("src/oaspec/codegen/allof_merge.gleam", 23).
?DOC(
" Merge allOf sub-schemas: properties, required, and additionalProperties.\n"
" Non-object sub-schemas (primitives, arrays) are included as a synthetic\n"
" \"value\" property to preserve their constraints.\n"
).
-spec merge_allof_schemas(
list(oaspec@openapi@schema:schema_ref()),
oaspec@codegen@context:context()
) -> merged_all_of().
merge_allof_schemas(Schemas, Ctx) ->
gleam@list:index_fold(
Schemas,
{merged_all_of, maps:new(), [], unspecified},
fun(Acc, S_ref, Idx) ->
Resolved = case S_ref of
{inline, Obj} ->
{ok, Obj};
{reference, _, _} ->
oaspec@openapi@resolver:resolve_schema_ref(
S_ref,
oaspec@codegen@context:spec(Ctx)
)
end,
case Resolved of
{ok,
{object_schema,
_,
Properties,
Required,
Additional_properties,
_,
_}} ->
Merged_ap = case {Additional_properties,
erlang:element(4, Acc)} of
{{typed, X}, _} ->
{typed, X};
{_, {typed, X@1}} ->
{typed, X@1};
{untyped, _} ->
untyped;
{_, untyped} ->
untyped;
{forbidden, _} ->
forbidden;
{_, forbidden} ->
forbidden;
{unspecified, unspecified} ->
unspecified
end,
{merged_all_of,
maps:merge(erlang:element(2, Acc), Properties),
lists:append(erlang:element(3, Acc), Required),
Merged_ap};
{ok, Schema_obj} ->
Field_name = case Idx of
0 ->
<<"value"/utf8>>;
N ->
<<"value_"/utf8,
(erlang:integer_to_binary(N))/binary>>
end,
{merged_all_of,
gleam@dict:insert(
erlang:element(2, Acc),
Field_name,
{inline, Schema_obj}
),
[Field_name | erlang:element(3, Acc)],
erlang:element(4, Acc)};
_ ->
Acc
end
end
).