Current section

Files

Jump to
json_blueprint src json@blueprint.erl
Raw

src/json@blueprint.erl

-module(json@blueprint).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([generate_json_schema/1, self_decoder/1, get_dynamic_decoder/1, decode/2, string/0, int/0, float/0, bool/0, list/1, reuse_decoder/1, field/2, optional/1, optional_field/2, encode_optional_field/4, union_type_encoder/2, union_type_decoder/1, enum_type_encoder/2, enum_type_decoder/1, map/2, tuple2/2, tuple3/3, tuple4/4, tuple5/5, tuple6/6, decode0/1, decode1/2, decode2/3, decode3/4, decode4/5, decode5/6, decode6/7, decode7/8, decode8/9, decode9/10, encode_tuple2/3, encode_tuple3/4, encode_tuple4/5, encode_tuple5/6, encode_tuple6/7, encode_tuple7/8, encode_tuple8/9, encode_tuple9/10]).
-export_type([decoder/1, field_decoder/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 decoder(GTW) :: {decoder,
fun((gleam@dynamic:dynamic_()) -> {ok, GTW} |
{error, list(gleam@dynamic:decode_error())}),
json@blueprint@schema:schema_definition(),
list({binary(), json@blueprint@schema:schema_definition()})}.
-type field_decoder(GTX) :: {field_decoder,
fun((gleam@dynamic:dynamic_()) -> {ok, GTX} |
{error, list(gleam@dynamic:decode_error())}),
{binary(), json@blueprint@schema:schema_definition()},
list({binary(), json@blueprint@schema:schema_definition()})}.
-file("src/json/blueprint.gleam", 32).
-spec generate_json_schema(decoder(any())) -> gleam@json:json().
generate_json_schema(Decoder) ->
Refs = case erlang:element(4, Decoder) of
[] ->
none;
Xs ->
{some, Xs}
end,
json@blueprint@schema:to_json(
json@blueprint@schema:new_schema(erlang:element(3, Decoder), Refs)
).
-file("src/json/blueprint.gleam", 132).
?DOC(
" Creates a decoder for recursive data types by allowing self-referential definitions.\n"
" This is useful when you have types that contain themselves, like trees or linked lists.\n"
"\n"
" The function takes a lazy decoder (a function that returns a decoder) to break the\n"
" recursive dependency cycle. The returned decoder uses a JSON Schema reference \"#\"\n"
" to point to the root schema definition.\n"
"\n"
" > ❗ _**IMPORTANT**_\n"
" > Add the reuse_decoder when there are nested recursive types so\n"
" > the schema references (`#`) get rewritten correctly and self-references from the\n"
" > different types don't get mixed up. As a recommendation, always add it when\n"
" > decoding recursive types.\n"
"\n"
" ## Example\n"
" ```gleam\n"
" // A binary tree type that can contain itself\n"
" pub type Tree {\n"
" Node(value: Int, left: Option(Tree), right: Option(Tree))\n"
" Leaf(value: Int)\n"
" }\n"
"\n"
" // Create a recursive decoder for the Tree type\n"
" pub fn tree_decoder() -> Decoder(Tree) {\n"
" // Use union_type_decoder for handling different variants\n"
" union_type_decoder([\n"
" #(\"leaf\", decode1(Leaf, field(\"value\", int()))),\n"
" #(\"node\", decode3(\n"
" Node,\n"
" field(\"value\", int()),\n"
" // Use self_decoder to handle recursive fields\n"
" field(\"left\", optional(self_decoder(tree_decoder))),\n"
" field(\"right\", optional(self_decoder(tree_decoder))),\n"
" )),\n"
" ])\n"
" |> reuse_decoder\n"
" }\n"
" ```\n"
).
-spec self_decoder(fun(() -> decoder(GUJ))) -> decoder(GUJ).
self_decoder(Lazy) ->
{decoder,
fun(Input) -> (erlang:element(2, Lazy()))(Input) end,
{ref, <<"#"/utf8>>},
[]}.
-file("src/json/blueprint.gleam", 136).
-spec get_dynamic_decoder(decoder(GUM)) -> fun((gleam@dynamic:dynamic_()) -> {ok,
GUM} |
{error, list(gleam@dynamic:decode_error())}).
get_dynamic_decoder(Decoder) ->
erlang:element(2, Decoder).
-file("src/json/blueprint.gleam", 140).
-spec decode(decoder(GUP), binary()) -> {ok, GUP} |
{error, gleam@json:decode_error()}.
decode(Decoder, Json_string) ->
gleam@json:decode(Json_string, erlang:element(2, Decoder)).
-file("src/json/blueprint.gleam", 147).
-spec string() -> decoder(binary()).
string() ->
{decoder, fun json@blueprint@dynamic:string/1, {type, string_type}, []}.
-file("src/json/blueprint.gleam", 151).
-spec int() -> decoder(integer()).
int() ->
{decoder, fun json@blueprint@dynamic:int/1, {type, integer_type}, []}.
-file("src/json/blueprint.gleam", 155).
-spec float() -> decoder(float()).
float() ->
{decoder, fun json@blueprint@dynamic:float/1, {type, number_type}, []}.
-file("src/json/blueprint.gleam", 159).
-spec bool() -> decoder(boolean()).
bool() ->
{decoder, fun json@blueprint@dynamic:bool/1, {type, boolean_type}, []}.
-file("src/json/blueprint.gleam", 163).
-spec list(decoder(GUX)) -> decoder(list(GUX)).
list(Decoder_type) ->
{decoder,
json@blueprint@dynamic:list(erlang:element(2, Decoder_type)),
{array, {some, erlang:element(3, Decoder_type)}},
erlang:element(4, Decoder_type)}.
-file("src/json/blueprint.gleam", 75).
?DOC(
" Creates a reusable version of a decoder that can be used multiple times in a schema\n"
" without duplicating the schema definition.\n"
"\n"
" The function:\n"
" 1. Creates a unique reference name based on the schema's hash\n"
" 2. Moves the original schema into the `$defs` section\n"
" 3. Returns a new decoder that references the schema via `$ref`\n"
"\n"
" ## Example\n"
" ```gleam\n"
" type Person {\n"
" Person(name: String, friends: List(Pet))\n"
" }\n"
"\n"
" type Pet {\n"
" Pet(name: String)\n"
" }\n"
"\n"
"\n"
" let pet_decoder = reuse_decoder(\n"
" decode2(\n"
" Pet,\n"
" field(\"name\", string()),\n"
" )\n"
" )\n"
"\n"
" let person_decoder = reuse_decoder(\n"
" decode2(\n"
" Person,\n"
" field(\"name\", string()),\n"
" field(\"friends\", list(pet_decoder))\n"
" )\n"
" )\n"
" ```\n"
).
-spec reuse_decoder(decoder(GUG)) -> decoder(GUG).
reuse_decoder(Decoder) ->
Def_name = <<"ref_"/utf8,
(json@blueprint@schema:hash_schema_definition(
erlang:element(3, Decoder)
))/binary>>,
Ref_name = <<"#/$defs/"/utf8, Def_name/binary>>,
Schema_with_rebased_self_refs = json@blueprint@schema:map_ref(
erlang:element(3, Decoder),
fun(Original_ref_name) -> case Original_ref_name of
<<"#"/utf8>> ->
Ref_name;
X ->
X
end end
),
{decoder,
erlang:element(2, Decoder),
{ref, Ref_name},
begin
_pipe = erlang:element(4, Decoder),
gleam@list:prepend(_pipe, {Def_name, Schema_with_rebased_self_refs})
end}.
-file("src/json/blueprint.gleam", 171).
-spec field(binary(), decoder(GVB)) -> field_decoder(GVB).
field(Name, Inner_type) ->
{field_decoder,
json@blueprint@dynamic:field(Name, erlang:element(2, Inner_type)),
{Name, erlang:element(3, Inner_type)},
erlang:element(4, Inner_type)}.
-file("src/json/blueprint.gleam", 201).
?DOC(
" Creates a decoder that can handle `null` values by wrapping the result in an `Option` type.\n"
" When the value is `null`, it returns `None`. Otherwise, it uses the provided decoder\n"
" to decode the value and wraps the result in `Some`. If you need the decoder to handle a possible missing field\n"
" (i.e., the field is absent from the JSON), use the `optional_field` function instead.\n"
"\n"
" ## Example\n"
" ```gleam\n"
" type User {\n"
" User(name: String, age: Option(Int))\n"
" }\n"
"\n"
" let decoder = decode2(\n"
" User,\n"
" field(\"name\", string()),\n"
" field(\"age\", optional(int())) // Will handle \"age\": null\n"
" )\n"
"\n"
" // These JSON strings will decode successfully:\n"
" // {\"name\": \"Alice\", \"age\": 25} -> User(\"Alice\", Some(25))\n"
" // {\"name\": \"Bob\", \"age\": null} -> User(\"Bob\", None)\n"
" ```\n"
).
-spec optional(decoder(GVE)) -> decoder(gleam@option:option(GVE)).
optional(Decode) ->
{decoder,
json@blueprint@dynamic:optional(erlang:element(2, Decode)),
{nullable, erlang:element(3, Decode)},
erlang:element(4, Decode)}.
-file("src/json/blueprint.gleam", 237).
?DOC(
" Decode a field that can be missing or have a `null` value into an `Option` type.\n"
" This function is useful when you want to handle both cases where a field is absent from the JSON\n"
" or when it's explicitly set to `null`.\n"
"\n"
" If you only need to handle fields that are present but might be `null`, use the `optional` function instead.\n"
"\n"
" ## Example\n"
" ```gleam\n"
" type User {\n"
" User(name: String, age: Option(Int))\n"
" }\n"
"\n"
" let decoder = decode2(\n"
" User,\n"
" field(\"name\", string()),\n"
" optional_field(\"age\", int()) // Will handle both missing \"age\" field and \"age\": null\n"
" )\n"
"\n"
" // All these JSON strings will decode successfully:\n"
" // {\"name\": \"Alice\", \"age\": 25} -> User(\"Alice\", Some(25))\n"
" // {\"name\": \"Bob\", \"age\": null} -> User(\"Bob\", None)\n"
" // {\"name\": \"Charlie\"} -> User(\"Charlie\", None)\n"
" ```\n"
).
-spec optional_field(binary(), decoder(GVI)) -> field_decoder(gleam@option:option(GVI)).
optional_field(Name, Inner_type) ->
{field_decoder,
fun(Value) ->
_pipe = (json@blueprint@dynamic:optional_field(
Name,
fun(Dyn) -> case Dyn =:= json_blueprint_ffi:null() of
false ->
gleam@result:map(
(erlang:element(2, Inner_type))(Dyn),
fun(Field@0) -> {some, Field@0} end
);
true ->
{ok, none}
end end
))(Value),
gleam@result:map(_pipe, fun gleam@option:flatten/1)
end,
{Name, {optional, erlang:element(3, Inner_type)}},
erlang:element(4, Inner_type)}.
-file("src/json/blueprint.gleam", 299).
?DOC(
" Adds an optional field to a list of key-value pairs that will be used to create a JSON object.\n"
" This is particularly useful when defining JSON encoder to pair up to the `optional_field` decoder.\n"
"\n"
" ## Example\n"
" ```gleam\n"
" fn tree_decoder() {\n"
" blueprint.union_type_decoder([\n"
" #(\n"
" \"node\",\n"
" blueprint.decode3(\n"
" Node,\n"
" blueprint.field(\"value\", blueprint.int()),\n"
" // This is an optional field for an optional value\n"
" blueprint.optional_field(\"left\", blueprint.self_decoder(tree_decoder)),\n"
" // And this is a required field with an optional value\n"
" blueprint.field(\n"
" \"right\",\n"
" blueprint.optional(blueprint.self_decoder(tree_decoder)),\n"
" ),\n"
" ),\n"
" ),\n"
" ])\n"
" |> blueprint.reuse_decoder\n"
" }\n"
"\n"
" fn encode_tree(tree: Tree) -> json.Json {\n"
" blueprint.union_type_encoder(tree, fn(node) {\n"
" case node {\n"
" Node(value, left, right) -> #(\n"
" \"node\",\n"
" [\n"
" #(\"value\", json.int(value)),\n"
" // This is a required field with an optional value\n"
" #(\"right\", json.nullable(right, encode_tree)),\n"
" ]\n"
" // And this is an optional field for an optional value\n"
" |> blueprint.encode_optional_field(\"left\", left, encode_tree)\n"
" |> json.object(),\n"
" )\n"
" }\n"
" })\n"
" }\n"
" ```\n"
).
-spec encode_optional_field(
list({binary(), gleam@json:json()}),
binary(),
gleam@option:option(GVN),
fun((GVN) -> gleam@json:json())
) -> list({binary(), gleam@json:json()}).
encode_optional_field(Fields, Name, Value, Encode_fn) ->
case Value of
{some, Left} ->
gleam@list:prepend(Fields, {Name, Encode_fn(Left)});
none ->
Fields
end.
-file("src/json/blueprint.gleam", 339).
?DOC(
" Function to encode a union type into a JSON object.\n"
" The function takes a value and an encoder function that returns a tuple of the type name and the JSON value.\n"
"\n"
"> [!IMPORTANT]\n"
"> Make sure to update the decoder function accordingly.\n"
"\n"
" ## Example\n"
" ```gleam\n"
" type Shape {\n"
" Circle(Float)\n"
" Rectangle(Float, Float)\n"
" }\n"
"\n"
" let shape_encoder = union_type_encoder(fn(shape) {\n"
" case shape {\n"
" Circle(radius) -> #(\"circle\", json.object([#(\"radius\", json.float(radius))]))\n"
" Rectangle(width, height) -> #(\n"
" \"rectangle\",\n"
" json.object([\n"
" #(\"width\", json.float(width)),\n"
" #(\"height\", json.float(height))\n"
" ])\n"
" )\n"
" }\n"
" })\n"
" ```\n"
).
-spec union_type_encoder(GVQ, fun((GVQ) -> {binary(), gleam@json:json()})) -> gleam@json:json().
union_type_encoder(Of, Encoder_fn) ->
{Field_name, Json_value} = Encoder_fn(Of),
gleam@json:object(
[{<<"type"/utf8>>, gleam@json:string(Field_name)},
{<<"data"/utf8>>, Json_value}]
).
-file("src/json/blueprint.gleam", 369).
?DOC(
" Function to defined a decoder for a union types.\n"
" The function takes a list of decoders for each possible type of the union.\n"
"\n"
"> [!IMPORTANT]\n"
"> Make sure to add tests for every possible type of the union because it is not possible to check for exhaustiveness in the case.\n"
"\n"
" ## Example\n"
" ```gleam\n"
" type Shape {\n"
" Circle(Float)\n"
" Rectangle(Float, Float)\n"
" }\n"
"\n"
" let shape_decoder = union_type_decoder([\n"
" #(\"circle\", decode1(Circle, field(\"radius\", float()))),\n"
" #(\"rectangle\", decode2(Rectangle,\n"
" field(\"width\", float()),\n"
" field(\"height\", float())\n"
" ))\n"
" ])\n"
" ```\n"
).
-spec union_type_decoder(list({binary(), decoder(GVR)})) -> decoder(GVR).
union_type_decoder(Decoders) ->
Constructor = fun(Type_str, Data) -> _pipe = Decoders,
_pipe@1 = gleam@list:find_map(
_pipe,
fun(Dec) -> case erlang:element(1, Dec) =:= Type_str of
true ->
{ok,
(erlang:element(2, (erlang:element(2, Dec))))(Data)};
_ ->
{error, []}
end end
),
_pipe@4 = gleam@result:map_error(
_pipe@1,
fun(_) ->
Valid_types = begin
_pipe@2 = Decoders,
_pipe@3 = gleam@list:map(
_pipe@2,
fun(Dec@1) -> erlang:element(1, Dec@1) end
),
gleam@string:join(_pipe@3, <<", "/utf8>>)
end,
[{decode_error,
<<"valid constructor type, one of: "/utf8,
Valid_types/binary>>,
Type_str,
[]}]
end
),
gleam@result:flatten(_pipe@4) end,
Enum_decoder = fun(Data@1) ->
_pipe@5 = (json@blueprint@dynamic:decode2(
Constructor,
json@blueprint@dynamic:field(
<<"type"/utf8>>,
fun json@blueprint@dynamic:string/1
),
json@blueprint@dynamic:field(
<<"data"/utf8>>,
fun json@blueprint@dynamic:dynamic/1
)
))(Data@1),
gleam@result:flatten(_pipe@5)
end,
Schema = case Decoders of
[] ->
{object, [], {some, false}, none};
[{Name, Dec@2}] ->
{object,
[{<<"type"/utf8>>,
{enum, [gleam@json:string(Name)], {some, string_type}}},
{<<"data"/utf8>>, erlang:element(3, Dec@2)}],
{some, false},
{some, [<<"type"/utf8>>, <<"data"/utf8>>]}};
Xs ->
_pipe@6 = gleam@list:map(
Xs,
fun(Field_dec) ->
{Name@1, Dec@3} = Field_dec,
{object,
[{<<"type"/utf8>>,
{enum,
[gleam@json:string(Name@1)],
{some, string_type}}},
{<<"data"/utf8>>, erlang:element(3, Dec@3)}],
{some, false},
{some, [<<"type"/utf8>>, <<"data"/utf8>>]}}
end
),
{any_of, _pipe@6}
end,
Defs = gleam@list:flat_map(
Decoders,
fun(Dec@4) -> erlang:element(4, (erlang:element(2, Dec@4))) end
),
{decoder, Enum_decoder, Schema, Defs}.
-file("src/json/blueprint.gleam", 465).
?DOC(
" Function to encode an enum type (unions where constructors have no arguments) into a JSON object.\n"
" The function takes a value and an encoder function that returns the string representation of the enum value.\n"
"\n"
"> [!IMPORTANT]\n"
"> Make sure to update the decoder function accordingly.\n"
"\n"
" ## Example\n"
" ```gleam\n"
" type Color {\n"
" Red\n"
" Green\n"
" Blue\n"
" }\n"
"\n"
" let color_encoder = enum_type_encoder(fn(color) {\n"
" case color {\n"
" Red -> \"red\"\n"
" Green -> \"green\"\n"
" Blue -> \"blue\"\n"
" }\n"
" })\n"
" ```\n"
).
-spec enum_type_encoder(GVV, fun((GVV) -> binary())) -> gleam@json:json().
enum_type_encoder(Of, Encoder_fn) ->
Field_name = Encoder_fn(Of),
gleam@json:object([{<<"enum"/utf8>>, gleam@json:string(Field_name)}]).
-file("src/json/blueprint.gleam", 494).
?DOC(
" Function to define a decoder for enum types (unions where constructors have no arguments).\n"
" The function takes a list of tuples containing the string representation and the corresponding enum value.\n"
"\n"
"> [!IMPORTANT]\n"
"> Make sure to add tests for every possible enum value because it is not possible to check for exhaustiveness.\n"
"\n"
" ## Example\n"
" ```gleam\n"
" type Color {\n"
" Red\n"
" Green\n"
" Blue\n"
" }\n"
"\n"
" let color_decoder = enum_type_decoder([\n"
" #(\"red\", Red),\n"
" #(\"green\", Green),\n"
" #(\"blue\", Blue),\n"
" ])\n"
" ```\n"
).
-spec enum_type_decoder(list({binary(), GVW})) -> decoder(GVW).
enum_type_decoder(Decoders) ->
Constructor = fun(Type_str) -> _pipe = Decoders,
_pipe@1 = gleam@list:find_map(
_pipe,
fun(Dec) -> case erlang:element(1, Dec) =:= Type_str of
true ->
{ok, erlang:element(2, Dec)};
_ ->
{error, []}
end end
),
gleam@result:map_error(
_pipe@1,
fun(_) ->
Valid_types = begin
_pipe@2 = Decoders,
_pipe@3 = gleam@list:map(
_pipe@2,
fun(Dec@1) -> erlang:element(1, Dec@1) end
),
gleam@string:join(_pipe@3, <<", "/utf8>>)
end,
[{decode_error,
<<"valid constructor type, one of: "/utf8,
Valid_types/binary>>,
Type_str,
[]}]
end
) end,
Enum_decoder = fun(Data) ->
_pipe@4 = (json@blueprint@dynamic:decode1(
Constructor,
json@blueprint@dynamic:field(
<<"enum"/utf8>>,
fun json@blueprint@dynamic:string/1
)
))(Data),
gleam@result:flatten(_pipe@4)
end,
{decoder,
Enum_decoder,
begin
_pipe@5 = gleam@list:map(
Decoders,
fun(Field_dec) ->
gleam@json:string(erlang:element(1, Field_dec))
end
),
_pipe@6 = (fun(Enum_values) ->
[{<<"enum"/utf8>>, {enum, Enum_values, {some, string_type}}}]
end)(_pipe@5),
{object, _pipe@6, {some, false}, {some, [<<"enum"/utf8>>]}}
end,
[]}.
-file("src/json/blueprint.gleam", 540).
-spec map(decoder(GVZ), fun((GVZ) -> GWB)) -> decoder(GWB).
map(Decoder, Foo) ->
{decoder,
fun(Input) ->
gleam@result:map((erlang:element(2, Decoder))(Input), Foo)
end,
erlang:element(3, Decoder),
erlang:element(4, Decoder)}.
-file("src/json/blueprint.gleam", 548).
-spec tuple2(decoder(GWD), decoder(GWF)) -> decoder({GWD, GWF}).
tuple2(Decode1, Decode2) ->
{decoder,
json@blueprint@dynamic:tuple2(
erlang:element(2, Decode1),
erlang:element(2, Decode2)
),
{detailed_array,
none,
{some, [erlang:element(3, Decode1), erlang:element(3, Decode2)]},
{some, 2},
{some, 2},
none,
none,
none,
none},
lists:append(erlang:element(4, Decode1), erlang:element(4, Decode2))}.
-file("src/json/blueprint.gleam", 568).
-spec tuple3(decoder(GWI), decoder(GWK), decoder(GWM)) -> decoder({GWI,
GWK,
GWM}).
tuple3(Decode1, Decode2, Decode3) ->
{decoder,
json@blueprint@dynamic:tuple3(
erlang:element(2, Decode1),
erlang:element(2, Decode2),
erlang:element(2, Decode3)
),
{detailed_array,
none,
{some,
[erlang:element(3, Decode1),
erlang:element(3, Decode2),
erlang:element(3, Decode3)]},
{some, 3},
{some, 3},
none,
none,
none,
none},
gleam@list:flatten(
[erlang:element(4, Decode1),
erlang:element(4, Decode2),
erlang:element(4, Decode3)]
)}.
-file("src/json/blueprint.gleam", 593).
-spec tuple4(decoder(GWP), decoder(GWR), decoder(GWT), decoder(GWV)) -> decoder({GWP,
GWR,
GWT,
GWV}).
tuple4(Decode1, Decode2, Decode3, Decode4) ->
{decoder,
json@blueprint@dynamic:tuple4(
erlang:element(2, Decode1),
erlang:element(2, Decode2),
erlang:element(2, Decode3),
erlang:element(2, Decode4)
),
{detailed_array,
none,
{some,
[erlang:element(3, Decode1),
erlang:element(3, Decode2),
erlang:element(3, Decode3),
erlang:element(3, Decode4)]},
{some, 4},
{some, 4},
none,
none,
none,
none},
gleam@list:flatten(
[erlang:element(4, Decode1),
erlang:element(4, Decode2),
erlang:element(4, Decode3),
erlang:element(4, Decode4)]
)}.
-file("src/json/blueprint.gleam", 620).
-spec tuple5(
decoder(GWY),
decoder(GXA),
decoder(GXC),
decoder(GXE),
decoder(GXG)
) -> decoder({GWY, GXA, GXC, GXE, GXG}).
tuple5(Decode1, Decode2, Decode3, Decode4, Decode5) ->
{decoder,
json@blueprint@dynamic:tuple5(
erlang:element(2, Decode1),
erlang:element(2, Decode2),
erlang:element(2, Decode3),
erlang:element(2, Decode4),
erlang:element(2, Decode5)
),
{detailed_array,
none,
{some,
[erlang:element(3, Decode1),
erlang:element(3, Decode2),
erlang:element(3, Decode3),
erlang:element(3, Decode4),
erlang:element(3, Decode5)]},
{some, 5},
{some, 5},
none,
none,
none,
none},
gleam@list:flatten(
[erlang:element(4, Decode1),
erlang:element(4, Decode2),
erlang:element(4, Decode3),
erlang:element(4, Decode4),
erlang:element(4, Decode5)]
)}.
-file("src/json/blueprint.gleam", 661).
-spec tuple6(
decoder(GXJ),
decoder(GXL),
decoder(GXN),
decoder(GXP),
decoder(GXR),
decoder(GXT)
) -> decoder({GXJ, GXL, GXN, GXP, GXR, GXT}).
tuple6(Decode1, Decode2, Decode3, Decode4, Decode5, Decode6) ->
{decoder,
json@blueprint@dynamic:tuple6(
erlang:element(2, Decode1),
erlang:element(2, Decode2),
erlang:element(2, Decode3),
erlang:element(2, Decode4),
erlang:element(2, Decode5),
erlang:element(2, Decode6)
),
{detailed_array,
none,
{some,
[erlang:element(3, Decode1),
erlang:element(3, Decode2),
erlang:element(3, Decode3),
erlang:element(3, Decode4),
erlang:element(3, Decode5),
erlang:element(3, Decode6)]},
{some, 6},
{some, 6},
none,
none,
none,
none},
gleam@list:flatten(
[erlang:element(4, Decode1),
erlang:element(4, Decode2),
erlang:element(4, Decode3),
erlang:element(4, Decode4),
erlang:element(4, Decode5),
erlang:element(4, Decode6)]
)}.
-file("src/json/blueprint.gleam", 706).
-spec create_object_schema(
list({binary(), json@blueprint@schema:schema_definition()})
) -> json@blueprint@schema:schema_definition().
create_object_schema(Fields) ->
{object,
Fields,
{some, false},
{some, gleam@list:filter_map(Fields, fun(Field_dec) -> case Field_dec of
{_, {optional, _}} ->
{error, nil};
{Name, _} ->
{ok, Name}
end end)}}.
-file("src/json/blueprint.gleam", 723).
-spec decode0(GXX) -> decoder(GXX).
decode0(Constructor) ->
{decoder,
fun(_) -> {ok, Constructor} end,
{object, [], {some, false}, none},
[]}.
-file("src/json/blueprint.gleam", 750).
-spec decode1(fun((GXZ) -> GYA), field_decoder(GXZ)) -> decoder(GYA).
decode1(Constructor, T1) ->
{decoder,
json@blueprint@dynamic:decode1(Constructor, erlang:element(2, T1)),
create_object_schema([erlang:element(3, T1)]),
erlang:element(4, T1)}.
-file("src/json/blueprint.gleam", 758).
-spec decode2(fun((GYD, GYE) -> GYF), field_decoder(GYD), field_decoder(GYE)) -> decoder(GYF).
decode2(Constructor, T1, T2) ->
{decoder,
json@blueprint@dynamic:decode2(
Constructor,
erlang:element(2, T1),
erlang:element(2, T2)
),
create_object_schema([erlang:element(3, T1), erlang:element(3, T2)]),
gleam@list:flatten([erlang:element(4, T1), erlang:element(4, T2)])}.
-file("src/json/blueprint.gleam", 770).
-spec decode3(
fun((GYJ, GYK, GYL) -> GYM),
field_decoder(GYJ),
field_decoder(GYK),
field_decoder(GYL)
) -> decoder(GYM).
decode3(Constructor, T1, T2, T3) ->
{decoder,
json@blueprint@dynamic:decode3(
Constructor,
erlang:element(2, T1),
erlang:element(2, T2),
erlang:element(2, T3)
),
create_object_schema(
[erlang:element(3, T1),
erlang:element(3, T2),
erlang:element(3, T3)]
),
gleam@list:flatten(
[erlang:element(4, T1),
erlang:element(4, T2),
erlang:element(4, T3)]
)}.
-file("src/json/blueprint.gleam", 783).
-spec decode4(
fun((GYR, GYS, GYT, GYU) -> GYV),
field_decoder(GYR),
field_decoder(GYS),
field_decoder(GYT),
field_decoder(GYU)
) -> decoder(GYV).
decode4(Constructor, T1, T2, T3, T4) ->
{decoder,
json@blueprint@dynamic:decode4(
Constructor,
erlang:element(2, T1),
erlang:element(2, T2),
erlang:element(2, T3),
erlang:element(2, T4)
),
create_object_schema(
[erlang:element(3, T1),
erlang:element(3, T2),
erlang:element(3, T3),
erlang:element(3, T4)]
),
gleam@list:flatten(
[erlang:element(4, T1),
erlang:element(4, T2),
erlang:element(4, T3),
erlang:element(4, T4)]
)}.
-file("src/json/blueprint.gleam", 808).
-spec decode5(
fun((GZB, GZC, GZD, GZE, GZF) -> GZG),
field_decoder(GZB),
field_decoder(GZC),
field_decoder(GZD),
field_decoder(GZE),
field_decoder(GZF)
) -> decoder(GZG).
decode5(Constructor, T1, T2, T3, T4, T5) ->
{decoder,
json@blueprint@dynamic:decode5(
Constructor,
erlang:element(2, T1),
erlang:element(2, T2),
erlang:element(2, T3),
erlang:element(2, T4),
erlang:element(2, T5)
),
create_object_schema(
[erlang:element(3, T1),
erlang:element(3, T2),
erlang:element(3, T3),
erlang:element(3, T4),
erlang:element(3, T5)]
),
gleam@list:flatten(
[erlang:element(4, T1),
erlang:element(4, T2),
erlang:element(4, T3),
erlang:element(4, T4),
erlang:element(4, T5)]
)}.
-file("src/json/blueprint.gleam", 836).
-spec decode6(
fun((GZN, GZO, GZP, GZQ, GZR, GZS) -> GZT),
field_decoder(GZN),
field_decoder(GZO),
field_decoder(GZP),
field_decoder(GZQ),
field_decoder(GZR),
field_decoder(GZS)
) -> decoder(GZT).
decode6(Constructor, T1, T2, T3, T4, T5, T6) ->
{decoder,
json@blueprint@dynamic:decode6(
Constructor,
erlang:element(2, T1),
erlang:element(2, T2),
erlang:element(2, T3),
erlang:element(2, T4),
erlang:element(2, T5),
erlang:element(2, T6)
),
create_object_schema(
[erlang:element(3, T1),
erlang:element(3, T2),
erlang:element(3, T3),
erlang:element(3, T4),
erlang:element(3, T5),
erlang:element(3, T6)]
),
gleam@list:flatten(
[erlang:element(4, T1),
erlang:element(4, T2),
erlang:element(4, T3),
erlang:element(4, T4),
erlang:element(4, T5),
erlang:element(4, T6)]
)}.
-file("src/json/blueprint.gleam", 867).
-spec decode7(
fun((HAB, HAC, HAD, HAE, HAF, HAG, HAH) -> HAI),
field_decoder(HAB),
field_decoder(HAC),
field_decoder(HAD),
field_decoder(HAE),
field_decoder(HAF),
field_decoder(HAG),
field_decoder(HAH)
) -> decoder(HAI).
decode7(Constructor, T1, T2, T3, T4, T5, T6, T7) ->
{decoder,
json@blueprint@dynamic:decode7(
Constructor,
erlang:element(2, T1),
erlang:element(2, T2),
erlang:element(2, T3),
erlang:element(2, T4),
erlang:element(2, T5),
erlang:element(2, T6),
erlang:element(2, T7)
),
create_object_schema(
[erlang:element(3, T1),
erlang:element(3, T2),
erlang:element(3, T3),
erlang:element(3, T4),
erlang:element(3, T5),
erlang:element(3, T6),
erlang:element(3, T7)]
),
gleam@list:flatten(
[erlang:element(4, T1),
erlang:element(4, T2),
erlang:element(4, T3),
erlang:element(4, T4),
erlang:element(4, T5),
erlang:element(4, T6),
erlang:element(4, T7)]
)}.
-file("src/json/blueprint.gleam", 901).
-spec decode8(
fun((HAR, HAS, HAT, HAU, HAV, HAW, HAX, HAY) -> HAZ),
field_decoder(HAR),
field_decoder(HAS),
field_decoder(HAT),
field_decoder(HAU),
field_decoder(HAV),
field_decoder(HAW),
field_decoder(HAX),
field_decoder(HAY)
) -> decoder(HAZ).
decode8(Constructor, T1, T2, T3, T4, T5, T6, T7, T8) ->
{decoder,
json@blueprint@dynamic:decode8(
Constructor,
erlang:element(2, T1),
erlang:element(2, T2),
erlang:element(2, T3),
erlang:element(2, T4),
erlang:element(2, T5),
erlang:element(2, T6),
erlang:element(2, T7),
erlang:element(2, T8)
),
create_object_schema(
[erlang:element(3, T1),
erlang:element(3, T2),
erlang:element(3, T3),
erlang:element(3, T4),
erlang:element(3, T5),
erlang:element(3, T6),
erlang:element(3, T7),
erlang:element(3, T8)]
),
gleam@list:flatten(
[erlang:element(4, T1),
erlang:element(4, T2),
erlang:element(4, T3),
erlang:element(4, T4),
erlang:element(4, T5),
erlang:element(4, T6),
erlang:element(4, T7),
erlang:element(4, T8)]
)}.
-file("src/json/blueprint.gleam", 947).
-spec decode9(
fun((HBJ, HBK, HBL, HBM, HBN, HBO, HBP, HBQ, HBR) -> HBS),
field_decoder(HBJ),
field_decoder(HBK),
field_decoder(HBL),
field_decoder(HBM),
field_decoder(HBN),
field_decoder(HBO),
field_decoder(HBP),
field_decoder(HBQ),
field_decoder(HBR)
) -> decoder(HBS).
decode9(Constructor, T1, T2, T3, T4, T5, T6, T7, T8, T9) ->
{decoder,
json@blueprint@dynamic:decode9(
Constructor,
erlang:element(2, T1),
erlang:element(2, T2),
erlang:element(2, T3),
erlang:element(2, T4),
erlang:element(2, T5),
erlang:element(2, T6),
erlang:element(2, T7),
erlang:element(2, T8),
erlang:element(2, T9)
),
create_object_schema(
[erlang:element(3, T1),
erlang:element(3, T2),
erlang:element(3, T3),
erlang:element(3, T4),
erlang:element(3, T5),
erlang:element(3, T6),
erlang:element(3, T7),
erlang:element(3, T8),
erlang:element(3, T9)]
),
gleam@list:flatten(
[erlang:element(4, T1),
erlang:element(4, T2),
erlang:element(4, T3),
erlang:element(4, T4),
erlang:element(4, T5),
erlang:element(4, T6),
erlang:element(4, T7),
erlang:element(4, T8),
erlang:element(4, T9)]
)}.
-file("src/json/blueprint.gleam", 997).
-spec encode_tuple2(
{HCD, HCE},
fun((HCD) -> gleam@json:json()),
fun((HCE) -> gleam@json:json())
) -> gleam@json:json().
encode_tuple2(Tuple, Encode1, Encode2) ->
{T1, T2} = Tuple,
gleam@json:preprocessed_array([Encode1(T1), Encode2(T2)]).
-file("src/json/blueprint.gleam", 1006).
-spec encode_tuple3(
{HCF, HCG, HCH},
fun((HCF) -> gleam@json:json()),
fun((HCG) -> gleam@json:json()),
fun((HCH) -> gleam@json:json())
) -> gleam@json:json().
encode_tuple3(Tuple, Encode1, Encode2, Encode3) ->
{T1, T2, T3} = Tuple,
gleam@json:preprocessed_array([Encode1(T1), Encode2(T2), Encode3(T3)]).
-file("src/json/blueprint.gleam", 1016).
-spec encode_tuple4(
{HCI, HCJ, HCK, HCL},
fun((HCI) -> gleam@json:json()),
fun((HCJ) -> gleam@json:json()),
fun((HCK) -> gleam@json:json()),
fun((HCL) -> gleam@json:json())
) -> gleam@json:json().
encode_tuple4(Tuple, Encode1, Encode2, Encode3, Encode4) ->
{T1, T2, T3, T4} = Tuple,
gleam@json:preprocessed_array(
[Encode1(T1), Encode2(T2), Encode3(T3), Encode4(T4)]
).
-file("src/json/blueprint.gleam", 1027).
-spec encode_tuple5(
{HCM, HCN, HCO, HCP, HCQ},
fun((HCM) -> gleam@json:json()),
fun((HCN) -> gleam@json:json()),
fun((HCO) -> gleam@json:json()),
fun((HCP) -> gleam@json:json()),
fun((HCQ) -> gleam@json:json())
) -> gleam@json:json().
encode_tuple5(Tuple, Encode1, Encode2, Encode3, Encode4, Encode5) ->
{T1, T2, T3, T4, T5} = Tuple,
gleam@json:preprocessed_array(
[Encode1(T1), Encode2(T2), Encode3(T3), Encode4(T4), Encode5(T5)]
).
-file("src/json/blueprint.gleam", 1045).
-spec encode_tuple6(
{HCR, HCS, HCT, HCU, HCV, HCW},
fun((HCR) -> gleam@json:json()),
fun((HCS) -> gleam@json:json()),
fun((HCT) -> gleam@json:json()),
fun((HCU) -> gleam@json:json()),
fun((HCV) -> gleam@json:json()),
fun((HCW) -> gleam@json:json())
) -> gleam@json:json().
encode_tuple6(Tuple, Encode1, Encode2, Encode3, Encode4, Encode5, Encode6) ->
{T1, T2, T3, T4, T5, T6} = Tuple,
gleam@json:preprocessed_array(
[Encode1(T1),
Encode2(T2),
Encode3(T3),
Encode4(T4),
Encode5(T5),
Encode6(T6)]
).
-file("src/json/blueprint.gleam", 1065).
-spec encode_tuple7(
{HCX, HCY, HCZ, HDA, HDB, HDC, HDD},
fun((HCX) -> gleam@json:json()),
fun((HCY) -> gleam@json:json()),
fun((HCZ) -> gleam@json:json()),
fun((HDA) -> gleam@json:json()),
fun((HDB) -> gleam@json:json()),
fun((HDC) -> gleam@json:json()),
fun((HDD) -> gleam@json:json())
) -> gleam@json:json().
encode_tuple7(
Tuple,
Encode1,
Encode2,
Encode3,
Encode4,
Encode5,
Encode6,
Encode7
) ->
{T1, T2, T3, T4, T5, T6, T7} = Tuple,
gleam@json:preprocessed_array(
[Encode1(T1),
Encode2(T2),
Encode3(T3),
Encode4(T4),
Encode5(T5),
Encode6(T6),
Encode7(T7)]
).
-file("src/json/blueprint.gleam", 1087).
-spec encode_tuple8(
{HDE, HDF, HDG, HDH, HDI, HDJ, HDK, HDL},
fun((HDE) -> gleam@json:json()),
fun((HDF) -> gleam@json:json()),
fun((HDG) -> gleam@json:json()),
fun((HDH) -> gleam@json:json()),
fun((HDI) -> gleam@json:json()),
fun((HDJ) -> gleam@json:json()),
fun((HDK) -> gleam@json:json()),
fun((HDL) -> gleam@json:json())
) -> gleam@json:json().
encode_tuple8(
Tuple,
Encode1,
Encode2,
Encode3,
Encode4,
Encode5,
Encode6,
Encode7,
Encode8
) ->
{T1, T2, T3, T4, T5, T6, T7, T8} = Tuple,
gleam@json:preprocessed_array(
[Encode1(T1),
Encode2(T2),
Encode3(T3),
Encode4(T4),
Encode5(T5),
Encode6(T6),
Encode7(T7),
Encode8(T8)]
).
-file("src/json/blueprint.gleam", 1111).
-spec encode_tuple9(
{HDM, HDN, HDO, HDP, HDQ, HDR, HDS, HDT, HDU},
fun((HDM) -> gleam@json:json()),
fun((HDN) -> gleam@json:json()),
fun((HDO) -> gleam@json:json()),
fun((HDP) -> gleam@json:json()),
fun((HDQ) -> gleam@json:json()),
fun((HDR) -> gleam@json:json()),
fun((HDS) -> gleam@json:json()),
fun((HDT) -> gleam@json:json()),
fun((HDU) -> gleam@json:json())
) -> gleam@json:json().
encode_tuple9(
Tuple,
Encode1,
Encode2,
Encode3,
Encode4,
Encode5,
Encode6,
Encode7,
Encode8,
Encode9
) ->
{T1, T2, T3, T4, T5, T6, T7, T8, T9} = Tuple,
gleam@json:preprocessed_array(
[Encode1(T1),
Encode2(T2),
Encode3(T3),
Encode4(T4),
Encode5(T5),
Encode6(T6),
Encode7(T7),
Encode8(T8),
Encode9(T9)]
).