Current section
Files
Jump to
Current section
Files
src/nori@document.erl
-module(nori@document).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/nori/document.gleam").
-export([new/2, v3_1_0/2, v3_1_1/2, with_info/2, add_server/2, with_servers/2, with_paths/2, add_path/3, with_components/2, add_webhook/3, add_security/2, add_tag/2, with_external_docs/2, with_json_schema_dialect/2, version_string/1, is_3_1/1, get_operation_ids/1]).
-export_type([document/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(
" OpenAPI Document (root object) for OpenAPI specifications.\n"
"\n"
" This is the root object of an OpenAPI document.\n"
).
-type document() :: {document,
nori@internal@version:open_api_version(),
nori@info:info(),
gleam@option:option(binary()),
list(nori@server:server()),
gleam@option:option(gleam@dict:dict(binary(), nori@reference:ref(nori@operation:path_item()))),
gleam@dict:dict(binary(), nori@reference:ref(nori@operation:path_item())),
gleam@option:option(nori@components:components()),
list(gleam@dict:dict(binary(), list(binary()))),
list(nori@operation:tag()),
gleam@option:option(nori@schema:external_documentation()),
gleam@dict:dict(binary(), gleam@json:json())}.
-file("src/nori/document.gleam", 50).
?DOC(" Creates a minimal `Document` with required fields.\n").
-spec new(nori@internal@version:open_api_version(), nori@info:info()) -> document().
new(Openapi, Info) ->
{document,
Openapi,
Info,
none,
[],
none,
maps:new(),
none,
[],
[],
none,
maps:new()}.
-file("src/nori/document.gleam", 67).
?DOC(" Creates a new OpenAPI 3.1.0 document.\n").
-spec v3_1_0(binary(), binary()) -> document().
v3_1_0(Title, Api_version) ->
new(v310, nori@info:new(Title, Api_version)).
-file("src/nori/document.gleam", 72).
?DOC(" Creates a new OpenAPI 3.1.1 document.\n").
-spec v3_1_1(binary(), binary()) -> document().
v3_1_1(Title, Api_version) ->
new(v311, nori@info:new(Title, Api_version)).
-file("src/nori/document.gleam", 77).
?DOC(" Sets the info on the document.\n").
-spec with_info(document(), nori@info:info()) -> document().
with_info(Doc, Info) ->
{document,
erlang:element(2, Doc),
Info,
erlang:element(4, Doc),
erlang:element(5, Doc),
erlang:element(6, Doc),
erlang:element(7, Doc),
erlang:element(8, Doc),
erlang:element(9, Doc),
erlang:element(10, Doc),
erlang:element(11, Doc),
erlang:element(12, Doc)}.
-file("src/nori/document.gleam", 82).
?DOC(" Adds a server to the document.\n").
-spec add_server(document(), nori@server:server()) -> document().
add_server(Doc, Server) ->
{document,
erlang:element(2, Doc),
erlang:element(3, Doc),
erlang:element(4, Doc),
lists:append(erlang:element(5, Doc), [Server]),
erlang:element(6, Doc),
erlang:element(7, Doc),
erlang:element(8, Doc),
erlang:element(9, Doc),
erlang:element(10, Doc),
erlang:element(11, Doc),
erlang:element(12, Doc)}.
-file("src/nori/document.gleam", 87).
?DOC(" Sets the servers on the document.\n").
-spec with_servers(document(), list(nori@server:server())) -> document().
with_servers(Doc, Servers) ->
{document,
erlang:element(2, Doc),
erlang:element(3, Doc),
erlang:element(4, Doc),
Servers,
erlang:element(6, Doc),
erlang:element(7, Doc),
erlang:element(8, Doc),
erlang:element(9, Doc),
erlang:element(10, Doc),
erlang:element(11, Doc),
erlang:element(12, Doc)}.
-file("src/nori/document.gleam", 92).
?DOC(" Sets the paths on the document.\n").
-spec with_paths(
document(),
gleam@dict:dict(binary(), nori@reference:ref(nori@operation:path_item()))
) -> document().
with_paths(Doc, Paths) ->
{document,
erlang:element(2, Doc),
erlang:element(3, Doc),
erlang:element(4, Doc),
erlang:element(5, Doc),
{some, Paths},
erlang:element(7, Doc),
erlang:element(8, Doc),
erlang:element(9, Doc),
erlang:element(10, Doc),
erlang:element(11, Doc),
erlang:element(12, Doc)}.
-file("src/nori/document.gleam", 97).
?DOC(" Adds a path to the document.\n").
-spec add_path(document(), binary(), nori@operation:path_item()) -> document().
add_path(Doc, Path, Item) ->
Current_paths = gleam@option:unwrap(erlang:element(6, Doc), maps:new()),
New_paths = gleam@dict:insert(Current_paths, Path, {inline, Item}),
{document,
erlang:element(2, Doc),
erlang:element(3, Doc),
erlang:element(4, Doc),
erlang:element(5, Doc),
{some, New_paths},
erlang:element(7, Doc),
erlang:element(8, Doc),
erlang:element(9, Doc),
erlang:element(10, Doc),
erlang:element(11, Doc),
erlang:element(12, Doc)}.
-file("src/nori/document.gleam", 104).
?DOC(" Sets the components on the document.\n").
-spec with_components(document(), nori@components:components()) -> document().
with_components(Doc, Components) ->
{document,
erlang:element(2, Doc),
erlang:element(3, Doc),
erlang:element(4, Doc),
erlang:element(5, Doc),
erlang:element(6, Doc),
erlang:element(7, Doc),
{some, Components},
erlang:element(9, Doc),
erlang:element(10, Doc),
erlang:element(11, Doc),
erlang:element(12, Doc)}.
-file("src/nori/document.gleam", 109).
?DOC(" Adds a webhook to the document.\n").
-spec add_webhook(document(), binary(), nori@operation:path_item()) -> document().
add_webhook(Doc, Name, Path_item) ->
{document,
erlang:element(2, Doc),
erlang:element(3, Doc),
erlang:element(4, Doc),
erlang:element(5, Doc),
erlang:element(6, Doc),
gleam@dict:insert(erlang:element(7, Doc), Name, {inline, Path_item}),
erlang:element(8, Doc),
erlang:element(9, Doc),
erlang:element(10, Doc),
erlang:element(11, Doc),
erlang:element(12, Doc)}.
-file("src/nori/document.gleam", 117).
?DOC(" Adds a security requirement to the document.\n").
-spec add_security(document(), gleam@dict:dict(binary(), list(binary()))) -> document().
add_security(Doc, Requirement) ->
{document,
erlang:element(2, Doc),
erlang:element(3, Doc),
erlang:element(4, Doc),
erlang:element(5, Doc),
erlang:element(6, Doc),
erlang:element(7, Doc),
erlang:element(8, Doc),
lists:append(erlang:element(9, Doc), [Requirement]),
erlang:element(10, Doc),
erlang:element(11, Doc),
erlang:element(12, Doc)}.
-file("src/nori/document.gleam", 122).
?DOC(" Adds a tag to the document.\n").
-spec add_tag(document(), nori@operation:tag()) -> document().
add_tag(Doc, Tag) ->
{document,
erlang:element(2, Doc),
erlang:element(3, Doc),
erlang:element(4, Doc),
erlang:element(5, Doc),
erlang:element(6, Doc),
erlang:element(7, Doc),
erlang:element(8, Doc),
erlang:element(9, Doc),
lists:append(erlang:element(10, Doc), [Tag]),
erlang:element(11, Doc),
erlang:element(12, Doc)}.
-file("src/nori/document.gleam", 127).
?DOC(" Sets the external docs on the document.\n").
-spec with_external_docs(document(), nori@schema:external_documentation()) -> document().
with_external_docs(Doc, External_docs) ->
{document,
erlang:element(2, Doc),
erlang:element(3, Doc),
erlang:element(4, Doc),
erlang:element(5, Doc),
erlang:element(6, Doc),
erlang:element(7, Doc),
erlang:element(8, Doc),
erlang:element(9, Doc),
erlang:element(10, Doc),
{some, External_docs},
erlang:element(12, Doc)}.
-file("src/nori/document.gleam", 135).
?DOC(" Sets the JSON Schema dialect on the document.\n").
-spec with_json_schema_dialect(document(), binary()) -> document().
with_json_schema_dialect(Doc, Dialect) ->
{document,
erlang:element(2, Doc),
erlang:element(3, Doc),
{some, Dialect},
erlang:element(5, Doc),
erlang:element(6, Doc),
erlang:element(7, Doc),
erlang:element(8, Doc),
erlang:element(9, Doc),
erlang:element(10, Doc),
erlang:element(11, Doc),
erlang:element(12, Doc)}.
-file("src/nori/document.gleam", 140).
?DOC(" Gets the OpenAPI version as a string.\n").
-spec version_string(document()) -> binary().
version_string(Doc) ->
nori@internal@version:to_string(erlang:element(2, Doc)).
-file("src/nori/document.gleam", 145).
?DOC(" Checks if the document uses OpenAPI 3.1.x.\n").
-spec is_3_1(document()) -> boolean().
is_3_1(Doc) ->
nori@internal@version:is_3_1(erlang:element(2, Doc)).
-file("src/nori/document.gleam", 180).
-spec add_op_id(list(binary()), gleam@option:option(nori@operation:operation())) -> list(binary()).
add_op_id(Acc, Op) ->
case Op of
none ->
Acc;
{some, Operation} ->
case erlang:element(6, Operation) of
none ->
Acc;
{some, Id} ->
[Id | Acc]
end
end.
-file("src/nori/document.gleam", 167).
-spec get_ops_from_path_item(nori@operation:path_item()) -> list(binary()).
get_ops_from_path_item(Item) ->
Ops = [],
Ops@1 = add_op_id(Ops, erlang:element(5, Item)),
Ops@2 = add_op_id(Ops@1, erlang:element(6, Item)),
Ops@3 = add_op_id(Ops@2, erlang:element(7, Item)),
Ops@4 = add_op_id(Ops@3, erlang:element(8, Item)),
Ops@5 = add_op_id(Ops@4, erlang:element(9, Item)),
Ops@6 = add_op_id(Ops@5, erlang:element(10, Item)),
Ops@7 = add_op_id(Ops@6, erlang:element(11, Item)),
Ops@8 = add_op_id(Ops@7, erlang:element(12, Item)),
Ops@8.
-file("src/nori/document.gleam", 150).
?DOC(" Gets all operation IDs from the document.\n").
-spec get_operation_ids(document()) -> list(binary()).
get_operation_ids(Doc) ->
case erlang:element(6, Doc) of
none ->
[];
{some, Paths} ->
gleam@dict:fold(Paths, [], fun(Acc, _, Item_ref) -> case Item_ref of
{reference, _} ->
Acc;
{inline, Item} ->
Ops = get_ops_from_path_item(Item),
lists:append(Acc, Ops)
end end)
end.