Current section
Files
Jump to
Current section
Files
src/pedantic@encode.erl
-module(pedantic@encode).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/pedantic/encode.gleam").
-export([list/1, optional/1, dict/1, object/1, field/4, build/1, title/2, describe/2, example/2]).
-export_type([encoder/1, object_builder/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.
-type encoder(FDP) :: {encoder,
pedantic@report:type_graph(),
fun((FDP) -> gleam@dynamic:dynamic_())}.
-opaque object_builder(FDQ) :: {object_builder,
binary(),
list(pedantic@report:type_field()),
fun((FDQ) -> list({binary(), gleam@dynamic:dynamic_()}))}.
-file("src/pedantic/encode.gleam", 47).
?DOC(" List combinator to encode lists to dynamic arrays.\n").
-spec list(encoder(FDT)) -> encoder(list(FDT)).
list(Element_encoder) ->
Function = fun(Lst) ->
Encoded_items = gleam@list:map(Lst, erlang:element(3, Element_encoder)),
gleam_stdlib:identity(Encoded_items)
end,
{encoder, {list, erlang:element(2, Element_encoder)}, Function}.
-file("src/pedantic/encode.gleam", 56).
?DOC(" Option/Optional combinator representing absent or nullable values.\n").
-spec optional(encoder(FDX)) -> encoder(gleam@option:option(FDX)).
optional(Inner_encoder) ->
Function = fun(Opt) -> case Opt of
{some, V} ->
(erlang:element(3, Inner_encoder))(V);
none ->
gleam@dynamic:nil()
end end,
{encoder, {option, erlang:element(2, Inner_encoder)}, Function}.
-file("src/pedantic/encode.gleam", 67).
?DOC(" Dict combinator to encode dictionaries to dynamic objects.\n").
-spec dict(encoder(FEB)) -> encoder(gleam@dict:dict(binary(), FEB)).
dict(Value_encoder) ->
Function = fun(D) ->
Entries = begin
_pipe = maps:to_list(D),
gleam@list:map(
_pipe,
fun(Pair) ->
{erlang:element(1, Pair),
(erlang:element(3, Value_encoder))(
erlang:element(2, Pair)
)}
end
)
end,
maps:from_list(Entries)
end,
{encoder, {dict, erlang:element(2, Value_encoder)}, Function}.
-file("src/pedantic/encode.gleam", 78).
?DOC(" Initializes an ObjectBuilder for a custom record constructor.\n").
-spec object(binary()) -> object_builder(any()).
object(Name) ->
{object_builder, Name, [], fun(_) -> [] end}.
-file("src/pedantic/encode.gleam", 83).
?DOC(" Applies a field description, encoder, and getter to the object builder.\n").
-spec field(object_builder(FEI), binary(), encoder(FEK), fun((FEI) -> FEK)) -> object_builder(FEI).
field(Builder, Name, Field_encoder, Get) ->
Fields = lists:append(
erlang:element(3, Builder),
[{type_field, Name, erlang:element(2, Field_encoder)}]
),
Encoder = fun(Val) ->
Field_val = Get(Val),
Encoded_field = (erlang:element(3, Field_encoder))(Field_val),
lists:append((erlang:element(4, Builder))(Val), [{Name, Encoded_field}])
end,
{object_builder, erlang:element(2, Builder), Fields, Encoder}.
-file("src/pedantic/encode.gleam", 102).
?DOC(" Finalizes the ObjectBuilder, converting it into a full Encoder.\n").
-spec build(object_builder(FEN)) -> encoder(FEN).
build(Builder) ->
Function = fun(Val) ->
Fields = (erlang:element(4, Builder))(Val),
maps:from_list(Fields)
end,
{encoder,
{object, erlang:element(2, Builder), erlang:element(3, Builder)},
Function}.
-file("src/pedantic/encode.gleam", 111).
?DOC(" Sets the title metadata in the AST graph.\n").
-spec title(encoder(FEQ), binary()) -> encoder(FEQ).
title(Encoder, Name) ->
New_graph = case erlang:element(2, Encoder) of
{annotated, Inner, Meta} ->
{annotated,
Inner,
{metadata,
{some, Name},
erlang:element(3, Meta),
erlang:element(4, Meta)}};
Other ->
{annotated, Other, {metadata, {some, Name}, none, none}}
end,
{encoder, New_graph, erlang:element(3, Encoder)}.
-file("src/pedantic/encode.gleam", 125).
?DOC(" Sets the description metadata in the AST graph.\n").
-spec describe(encoder(FET), binary()) -> encoder(FET).
describe(Encoder, Desc) ->
New_graph = case erlang:element(2, Encoder) of
{annotated, Inner, Meta} ->
{annotated,
Inner,
{metadata,
erlang:element(2, Meta),
{some, Desc},
erlang:element(4, Meta)}};
Other ->
{annotated, Other, {metadata, none, {some, Desc}, none}}
end,
{encoder, New_graph, erlang:element(3, Encoder)}.
-file("src/pedantic/encode.gleam", 139).
?DOC(" Sets the example metadata in the AST graph.\n").
-spec example(encoder(FEW), gleam@dynamic:dynamic_()) -> encoder(FEW).
example(Encoder, Ex) ->
New_graph = case erlang:element(2, Encoder) of
{annotated, Inner, Meta} ->
{annotated,
Inner,
{metadata,
erlang:element(2, Meta),
erlang:element(3, Meta),
{some, Ex}}};
Other ->
{annotated, Other, {metadata, none, none, {some, Ex}}}
end,
{encoder, New_graph, erlang:element(3, Encoder)}.