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]).
bool() ->
{decoder, fun gleam@dynamic:bool/1}.
atom() ->
{decoder, fun gleam@dynamic:atom/1}.
int() ->
{decoder, fun gleam@dynamic:int/1}.
float() ->
{decoder, fun gleam@dynamic:float/1}.
string() ->
{decoder, fun gleam@dynamic:string/1}.
element(Position, Decoder) ->
{decoder, DecodeFun} = Decoder,
Fun = fun(Dynamic) ->
gleam@result:then(gleam@dynamic:element(Dynamic, Position), DecodeFun)
end,
{decoder, Fun}.
field(Named, Decoder) ->
{decoder, DecodeFun} = Decoder,
Fun = fun(Dynamic) ->
gleam@result:then(gleam@dynamic:field(Dynamic, Named), DecodeFun)
end,
{decoder, Fun}.
atom_field(Named, Decoder) ->
{decoder, DecodeFun} = Decoder,
NamedResult = 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(
NamedResult,
fun(GleamCaptureVariable) ->
gleam@dynamic:field(Dynamic, GleamCaptureVariable)
end
),
DecodeFun
)
end,
{decoder, Fun}.
list(Decoder) ->
{decoder, DecodeFun} = Decoder,
ListFun = fun(Dynamic) -> gleam@dynamic:list(Dynamic, DecodeFun) end,
{decoder, ListFun}.
dynamic() ->
{decoder, fun(Dynamic) -> {ok, Dynamic} end}.
succeed(A) ->
{decoder, fun(_) -> {ok, A} end}.
fail(Error) ->
{decoder, fun(_) -> {error, Error} end}.
try_decoders(Dynamic, Decoders) ->
case Decoders of
[{decoder, DecodeFun} | RemainingDecoders] ->
case DecodeFun(Dynamic) of
{ok, Val} ->
{ok, Val};
{error, _str} ->
try_decoders(Dynamic, RemainingDecoders)
end;
[] ->
{error, <<"All decoders failed"/utf8>>}
end.
one_of(Decoders) ->
{decoder, fun(Dynamic) -> try_decoders(Dynamic, Decoders) end}.
unwrap(Decoder) ->
{decoder, DecodeFun} = Decoder,
DecodeFun.
then(Decoder, Fun) ->
{decoder, DecodeFun} = Decoder,
UnwrappedDecoderFun = gleam@function:compose(Fun, fun unwrap/1),
{decoder,
fun(Dynamic) ->
gleam@result:then(
DecodeFun(Dynamic),
fun(A) -> (UnwrappedDecoderFun(A))(Dynamic) end
)
end}.
from_result(Result) ->
case Result of
{ok, Value} ->
succeed(Value);
{error, Error} ->
fail(Error)
end.
ok_error_tuple(OkDecoder, ErrorDecoder) ->
FailureDecoder = fun(AtomAsString) ->
fail(
gleam@string:append(
gleam@string:append(
<<"Expected 'ok' or 'error' atom in first position of tuple, got '"/utf8>>,
AtomAsString
),
<<"' atom instead"/utf8>>
)
)
end,
SuccessOrFailureFun = fun(ResultAtom) ->
case gleam@atom:to_string(ResultAtom) of
<<"ok"/utf8>> ->
OkDecoder;
<<"error"/utf8>> ->
ErrorDecoder;
AtomAsString@1 ->
FailureDecoder(AtomAsString@1)
end
end,
then(element(0, atom()), SuccessOrFailureFun).
map(Fun, Decoder) ->
{decoder, DecodeFun} = Decoder,
MappedFun = fun(Dynamic) -> gleam@result:map(DecodeFun(Dynamic), Fun) end,
{decoder, MappedFun}.
map2(Fun, Decoder1, Decoder2) ->
{decoder, DecodeFun1} = Decoder1,
{decoder, DecodeFun2} = Decoder2,
MappedFun = fun(Dynamic) ->
case {DecodeFun1(Dynamic), DecodeFun2(Dynamic)} of
{{ok, A}, {ok, B}} ->
{ok, Fun(A, B)};
{{error, Str}, _} ->
{error, Str};
{_, {error, Str@1}} ->
{error, Str@1}
end
end,
{decoder, MappedFun}.
map3(Fun, Decoder1, Decoder2, Decoder3) ->
{decoder, DecodeFun1} = Decoder1,
{decoder, DecodeFun2} = Decoder2,
{decoder, DecodeFun3} = Decoder3,
MappedFun = fun(Dynamic) ->
case {DecodeFun1(Dynamic), DecodeFun2(Dynamic), DecodeFun3(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, MappedFun}.
map4(Fun, Decoder1, Decoder2, Decoder3, Decoder4) ->
{decoder, DecodeFun1} = Decoder1,
{decoder, DecodeFun2} = Decoder2,
{decoder, DecodeFun3} = Decoder3,
{decoder, DecodeFun4} = Decoder4,
MappedFun = fun(Dynamic) ->
case {DecodeFun1(Dynamic),
DecodeFun2(Dynamic),
DecodeFun3(Dynamic),
DecodeFun4(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, MappedFun}.
map5(Fun, Decoder1, Decoder2, Decoder3, Decoder4, Decoder5) ->
{decoder, DecodeFun1} = Decoder1,
{decoder, DecodeFun2} = Decoder2,
{decoder, DecodeFun3} = Decoder3,
{decoder, DecodeFun4} = Decoder4,
{decoder, DecodeFun5} = Decoder5,
MappedFun = fun(Dynamic) ->
case {DecodeFun1(Dynamic),
DecodeFun2(Dynamic),
DecodeFun3(Dynamic),
DecodeFun4(Dynamic),
DecodeFun5(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, MappedFun}.
map6(Fun, Decoder1, Decoder2, Decoder3, Decoder4, Decoder5, Decoder6) ->
{decoder, DecodeFun1} = Decoder1,
{decoder, DecodeFun2} = Decoder2,
{decoder, DecodeFun3} = Decoder3,
{decoder, DecodeFun4} = Decoder4,
{decoder, DecodeFun5} = Decoder5,
{decoder, DecodeFun6} = Decoder6,
MappedFun = fun(Dynamic) ->
case {DecodeFun1(Dynamic),
DecodeFun2(Dynamic),
DecodeFun3(Dynamic),
DecodeFun4(Dynamic),
DecodeFun5(Dynamic),
DecodeFun6(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, MappedFun}.
map7(Fun, Decoder1, Decoder2, Decoder3, Decoder4, Decoder5, Decoder6, Decoder7) ->
{decoder, DecodeFun1} = Decoder1,
{decoder, DecodeFun2} = Decoder2,
{decoder, DecodeFun3} = Decoder3,
{decoder, DecodeFun4} = Decoder4,
{decoder, DecodeFun5} = Decoder5,
{decoder, DecodeFun6} = Decoder6,
{decoder, DecodeFun7} = Decoder7,
MappedFun = fun(Dynamic) ->
case {DecodeFun1(Dynamic),
DecodeFun2(Dynamic),
DecodeFun3(Dynamic),
DecodeFun4(Dynamic),
DecodeFun5(Dynamic),
DecodeFun6(Dynamic),
DecodeFun7(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, MappedFun}.
map8(
Fun,
Decoder1,
Decoder2,
Decoder3,
Decoder4,
Decoder5,
Decoder6,
Decoder7,
Decoder8
) ->
{decoder, DecodeFun1} = Decoder1,
{decoder, DecodeFun2} = Decoder2,
{decoder, DecodeFun3} = Decoder3,
{decoder, DecodeFun4} = Decoder4,
{decoder, DecodeFun5} = Decoder5,
{decoder, DecodeFun6} = Decoder6,
{decoder, DecodeFun7} = Decoder7,
{decoder, DecodeFun8} = Decoder8,
MappedFun = fun(Dynamic) ->
case {DecodeFun1(Dynamic),
DecodeFun2(Dynamic),
DecodeFun3(Dynamic),
DecodeFun4(Dynamic),
DecodeFun5(Dynamic),
DecodeFun6(Dynamic),
DecodeFun7(Dynamic),
DecodeFun8(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, MappedFun}.
decode_dynamic(Dynamic, Decoder) ->
{decoder, DecodeFun} = Decoder,
DecodeFun(Dynamic).