Current section
Files
Jump to
Current section
Files
gen/src/decode.erl
-module(decode).
-compile(no_auto_import).
-export([bool/0, atom/0, int/0, float/0, string/0, element/2, field/2, atom_field/2, list/1, dynamic/0, succeed/1, fail/1, one_of/1, then/2, from_result/1, ok_error_tuple/2, map/2, map2/3, map3/4, map4/5, map5/6, map6/7, map7/8, map8/9, decode_dynamic/2]).
-export_type([decoder/1]).
-type decoder(CCP) :: {decoder,
fun((gleam@dynamic:dynamic()) -> {ok, CCP} |
{error, binary()})}.
-spec bool() -> decoder(boolean()).
bool() ->
{decoder, fun gleam@dynamic:bool/1}.
-spec atom() -> decoder(gleam@atom:atom_()).
atom() ->
{decoder, fun gleam@dynamic:atom/1}.
-spec int() -> decoder(integer()).
int() ->
{decoder, fun gleam@dynamic:int/1}.
-spec float() -> decoder(float()).
float() ->
{decoder, fun gleam@dynamic:float/1}.
-spec string() -> decoder(binary()).
string() ->
{decoder, fun gleam@dynamic:string/1}.
-spec element(integer(), decoder(CCX)) -> decoder(CCX).
element(Position, Decoder) ->
{decoder, Decode_fun} = Decoder,
Fun = fun(Dynamic) ->
gleam@result:then(gleam@dynamic:element(Dynamic, Position), Decode_fun)
end,
{decoder, Fun}.
-spec field(any(), decoder(CDB)) -> decoder(CDB).
field(Named, Decoder) ->
{decoder, Decode_fun} = Decoder,
Fun = fun(Dynamic) ->
gleam@result:then(gleam@dynamic:field(Dynamic, Named), Decode_fun)
end,
{decoder, Fun}.
-spec atom_field(binary(), decoder(CDE)) -> decoder(CDE).
atom_field(Named, Decoder) ->
{decoder, Decode_fun} = Decoder,
Named_result = gleam@result:map_error(
gleam@atom:from_string(Named),
fun(_) ->
gleam@string:append(
gleam@string:append(<<"No atom key by name of `"/utf8>>, Named),
<<"` found"/utf8>>
)
end
),
Fun = fun(Dynamic) ->
gleam@result:then(
gleam@result:then(
Named_result,
fun(Gleam@capture_variable) ->
gleam@dynamic:field(Dynamic, Gleam@capture_variable)
end
),
Decode_fun
)
end,
{decoder, Fun}.
-spec list(decoder(CDH)) -> decoder(list(CDH)).
list(Decoder) ->
{decoder, Decode_fun} = Decoder,
List_fun = fun(Gleam@capture_variable) ->
gleam@dynamic:typed_list(Gleam@capture_variable, Decode_fun)
end,
{decoder, List_fun}.
-spec dynamic() -> decoder(gleam@dynamic:dynamic()).
dynamic() ->
{decoder, fun(Dynamic) -> {ok, Dynamic} end}.
-spec succeed(CDN) -> decoder(CDN).
succeed(A) ->
{decoder, fun(_) -> {ok, A} end}.
-spec fail(binary()) -> decoder(any()).
fail(Error) ->
{decoder, fun(_) -> {error, Error} end}.
-spec try_decoders(gleam@dynamic:dynamic(), list(decoder(CDR))) -> {ok, CDR} |
{error, binary()}.
try_decoders(Dynamic, Decoders) ->
case Decoders of
[{decoder, Decode_fun} | Remaining_decoders] ->
case Decode_fun(Dynamic) of
{ok, Val} ->
{ok, Val};
{error, _} ->
try_decoders(Dynamic, Remaining_decoders)
end;
[] ->
{error, <<"All decoders failed"/utf8>>}
end.
-spec one_of(list(decoder(CDW))) -> decoder(CDW).
one_of(Decoders) ->
{decoder, fun(Dynamic) -> try_decoders(Dynamic, Decoders) end}.
-spec unwrap(decoder(CEA)) -> fun((gleam@dynamic:dynamic()) -> {ok, CEA} |
{error, binary()}).
unwrap(Decoder) ->
{decoder, Decode_fun} = Decoder,
Decode_fun.
-spec then(decoder(CEE), fun((CEE) -> decoder(CEG))) -> decoder(CEG).
then(Decoder, Fun) ->
{decoder, Decode_fun} = Decoder,
Unwrapped_decoder_fun = gleam@function:compose(Fun, fun unwrap/1),
{decoder,
fun(Dynamic) ->
gleam@result:then(
Decode_fun(Dynamic),
fun(A) -> (Unwrapped_decoder_fun(A))(Dynamic) end
)
end}.
-spec from_result({ok, CEJ} | {error, binary()}) -> decoder(CEJ).
from_result(Result) ->
case Result of
{ok, Value} ->
succeed(Value);
{error, Error} ->
fail(Error)
end.
-spec ok_error_tuple(decoder(CEN), decoder(CEN)) -> decoder(CEN).
ok_error_tuple(Ok_decoder, Error_decoder) ->
Failure_decoder = fun(Atom_as_string) ->
fail(
gleam@string:append(
gleam@string:append(
<<"Expected 'ok' or 'error' atom in first position of tuple, got '"/utf8>>,
Atom_as_string
),
<<"' atom instead"/utf8>>
)
)
end,
Success_or_failure_fun = fun(Result_atom) ->
case gleam@atom:to_string(Result_atom) of
<<"ok"/utf8>> ->
Ok_decoder;
<<"error"/utf8>> ->
Error_decoder;
Atom_as_string@1 ->
Failure_decoder(Atom_as_string@1)
end
end,
then(element(0, atom()), Success_or_failure_fun).
-spec map(fun((CER) -> CES), decoder(CER)) -> decoder(CES).
map(Fun, Decoder) ->
{decoder, Decode_fun} = Decoder,
Mapped_fun = fun(Dynamic) -> gleam@result:map(Decode_fun(Dynamic), Fun) end,
{decoder, Mapped_fun}.
-spec map2(fun((CEV, CEW) -> CEX), decoder(CEV), decoder(CEW)) -> decoder(CEX).
map2(Fun, Decoder1, Decoder2) ->
{decoder, Decode_fun1} = Decoder1,
{decoder, Decode_fun2} = Decoder2,
Mapped_fun = fun(Dynamic) ->
case {Decode_fun1(Dynamic), Decode_fun2(Dynamic)} of
{{ok, A}, {ok, B}} ->
{ok, Fun(A, B)};
{{error, Str}, _} ->
{error, Str};
{_, {error, Str@1}} ->
{error, Str@1}
end
end,
{decoder, Mapped_fun}.
-spec map3(
fun((CFB, CFC, CFD) -> CFE),
decoder(CFB),
decoder(CFC),
decoder(CFD)
) -> decoder(CFE).
map3(Fun, Decoder1, Decoder2, Decoder3) ->
{decoder, Decode_fun1} = Decoder1,
{decoder, Decode_fun2} = Decoder2,
{decoder, Decode_fun3} = Decoder3,
Mapped_fun = fun(Dynamic) ->
case {Decode_fun1(Dynamic), Decode_fun2(Dynamic), Decode_fun3(Dynamic)} of
{{ok, A}, {ok, B}, {ok, C}} ->
{ok, Fun(A, B, C)};
{{error, Str}, _, _} ->
{error, Str};
{_, {error, Str@1}, _} ->
{error, Str@1};
{_, _, {error, Str@2}} ->
{error, Str@2}
end
end,
{decoder, Mapped_fun}.
-spec map4(
fun((CFJ, CFK, CFL, CFM) -> CFN),
decoder(CFJ),
decoder(CFK),
decoder(CFL),
decoder(CFM)
) -> decoder(CFN).
map4(Fun, Decoder1, Decoder2, Decoder3, Decoder4) ->
{decoder, Decode_fun1} = Decoder1,
{decoder, Decode_fun2} = Decoder2,
{decoder, Decode_fun3} = Decoder3,
{decoder, Decode_fun4} = Decoder4,
Mapped_fun = fun(Dynamic) ->
case {Decode_fun1(Dynamic),
Decode_fun2(Dynamic),
Decode_fun3(Dynamic),
Decode_fun4(Dynamic)} of
{{ok, A}, {ok, B}, {ok, C}, {ok, D}} ->
{ok, Fun(A, B, C, D)};
{{error, Str}, _, _, _} ->
{error, Str};
{_, {error, Str@1}, _, _} ->
{error, Str@1};
{_, _, {error, Str@2}, _} ->
{error, Str@2};
{_, _, _, {error, Str@3}} ->
{error, Str@3}
end
end,
{decoder, Mapped_fun}.
-spec map5(
fun((CFT, CFU, CFV, CFW, CFX) -> CFY),
decoder(CFT),
decoder(CFU),
decoder(CFV),
decoder(CFW),
decoder(CFX)
) -> decoder(CFY).
map5(Fun, Decoder1, Decoder2, Decoder3, Decoder4, Decoder5) ->
{decoder, Decode_fun1} = Decoder1,
{decoder, Decode_fun2} = Decoder2,
{decoder, Decode_fun3} = Decoder3,
{decoder, Decode_fun4} = Decoder4,
{decoder, Decode_fun5} = Decoder5,
Mapped_fun = fun(Dynamic) ->
case {Decode_fun1(Dynamic),
Decode_fun2(Dynamic),
Decode_fun3(Dynamic),
Decode_fun4(Dynamic),
Decode_fun5(Dynamic)} of
{{ok, A}, {ok, B}, {ok, C}, {ok, D}, {ok, E}} ->
{ok, Fun(A, B, C, D, E)};
{{error, Str}, _, _, _, _} ->
{error, Str};
{_, {error, Str@1}, _, _, _} ->
{error, Str@1};
{_, _, {error, Str@2}, _, _} ->
{error, Str@2};
{_, _, _, {error, Str@3}, _} ->
{error, Str@3};
{_, _, _, _, {error, Str@4}} ->
{error, Str@4}
end
end,
{decoder, Mapped_fun}.
-spec map6(
fun((CGF, CGG, CGH, CGI, CGJ, CGK) -> CGL),
decoder(CGF),
decoder(CGG),
decoder(CGH),
decoder(CGI),
decoder(CGJ),
decoder(CGK)
) -> decoder(CGL).
map6(Fun, Decoder1, Decoder2, Decoder3, Decoder4, Decoder5, Decoder6) ->
{decoder, Decode_fun1} = Decoder1,
{decoder, Decode_fun2} = Decoder2,
{decoder, Decode_fun3} = Decoder3,
{decoder, Decode_fun4} = Decoder4,
{decoder, Decode_fun5} = Decoder5,
{decoder, Decode_fun6} = Decoder6,
Mapped_fun = fun(Dynamic) ->
case {Decode_fun1(Dynamic),
Decode_fun2(Dynamic),
Decode_fun3(Dynamic),
Decode_fun4(Dynamic),
Decode_fun5(Dynamic),
Decode_fun6(Dynamic)} of
{{ok, A}, {ok, B}, {ok, C}, {ok, D}, {ok, E}, {ok, F}} ->
{ok, Fun(A, B, C, D, E, F)};
{{error, Str}, _, _, _, _, _} ->
{error, Str};
{_, {error, Str@1}, _, _, _, _} ->
{error, Str@1};
{_, _, {error, Str@2}, _, _, _} ->
{error, Str@2};
{_, _, _, {error, Str@3}, _, _} ->
{error, Str@3};
{_, _, _, _, {error, Str@4}, _} ->
{error, Str@4};
{_, _, _, _, _, {error, Str@5}} ->
{error, Str@5}
end
end,
{decoder, Mapped_fun}.
-spec map7(
fun((CGT, CGU, CGV, CGW, CGX, CGY, CGZ) -> CHA),
decoder(CGT),
decoder(CGU),
decoder(CGV),
decoder(CGW),
decoder(CGX),
decoder(CGY),
decoder(CGZ)
) -> decoder(CHA).
map7(Fun, Decoder1, Decoder2, Decoder3, Decoder4, Decoder5, Decoder6, Decoder7) ->
{decoder, Decode_fun1} = Decoder1,
{decoder, Decode_fun2} = Decoder2,
{decoder, Decode_fun3} = Decoder3,
{decoder, Decode_fun4} = Decoder4,
{decoder, Decode_fun5} = Decoder5,
{decoder, Decode_fun6} = Decoder6,
{decoder, Decode_fun7} = Decoder7,
Mapped_fun = fun(Dynamic) ->
case {Decode_fun1(Dynamic),
Decode_fun2(Dynamic),
Decode_fun3(Dynamic),
Decode_fun4(Dynamic),
Decode_fun5(Dynamic),
Decode_fun6(Dynamic),
Decode_fun7(Dynamic)} of
{{ok, A}, {ok, B}, {ok, C}, {ok, D}, {ok, E}, {ok, F}, {ok, G}} ->
{ok, Fun(A, B, C, D, E, F, G)};
{{error, Str}, _, _, _, _, _, _} ->
{error, Str};
{_, {error, Str@1}, _, _, _, _, _} ->
{error, Str@1};
{_, _, {error, Str@2}, _, _, _, _} ->
{error, Str@2};
{_, _, _, {error, Str@3}, _, _, _} ->
{error, Str@3};
{_, _, _, _, {error, Str@4}, _, _} ->
{error, Str@4};
{_, _, _, _, _, {error, Str@5}, _} ->
{error, Str@5};
{_, _, _, _, _, _, {error, Str@6}} ->
{error, Str@6}
end
end,
{decoder, Mapped_fun}.
-spec map8(
fun((CHJ, CHK, CHL, CHM, CHN, CHO, CHP, CHQ) -> CHR),
decoder(CHJ),
decoder(CHK),
decoder(CHL),
decoder(CHM),
decoder(CHN),
decoder(CHO),
decoder(CHP),
decoder(CHQ)
) -> decoder(CHR).
map8(
Fun,
Decoder1,
Decoder2,
Decoder3,
Decoder4,
Decoder5,
Decoder6,
Decoder7,
Decoder8
) ->
{decoder, Decode_fun1} = Decoder1,
{decoder, Decode_fun2} = Decoder2,
{decoder, Decode_fun3} = Decoder3,
{decoder, Decode_fun4} = Decoder4,
{decoder, Decode_fun5} = Decoder5,
{decoder, Decode_fun6} = Decoder6,
{decoder, Decode_fun7} = Decoder7,
{decoder, Decode_fun8} = Decoder8,
Mapped_fun = fun(Dynamic) ->
case {Decode_fun1(Dynamic),
Decode_fun2(Dynamic),
Decode_fun3(Dynamic),
Decode_fun4(Dynamic),
Decode_fun5(Dynamic),
Decode_fun6(Dynamic),
Decode_fun7(Dynamic),
Decode_fun8(Dynamic)} of
{{ok, A},
{ok, B},
{ok, C},
{ok, D},
{ok, E},
{ok, F},
{ok, G},
{ok, H}} ->
{ok, Fun(A, B, C, D, E, F, G, H)};
{{error, Str}, _, _, _, _, _, _, _} ->
{error, Str};
{_, {error, Str@1}, _, _, _, _, _, _} ->
{error, Str@1};
{_, _, {error, Str@2}, _, _, _, _, _} ->
{error, Str@2};
{_, _, _, {error, Str@3}, _, _, _, _} ->
{error, Str@3};
{_, _, _, _, {error, Str@4}, _, _, _} ->
{error, Str@4};
{_, _, _, _, _, {error, Str@5}, _, _} ->
{error, Str@5};
{_, _, _, _, _, _, {error, Str@6}, _} ->
{error, Str@6};
{_, _, _, _, _, _, _, {error, Str@7}} ->
{error, Str@7}
end
end,
{decoder, Mapped_fun}.
-spec decode_dynamic(gleam@dynamic:dynamic(), decoder(CIB)) -> {ok, CIB} |
{error, binary()}.
decode_dynamic(Dynamic, Decoder) ->
{decoder, Decode_fun} = Decoder,
Decode_fun(Dynamic).