Current section
Files
Jump to
Current section
Files
src/libero@json@runtime.erl
-module(libero@json@runtime).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/libero/json/runtime.gleam").
-export([field/3, field_string/3, string/2, int/2, float/2, bool/2, nil/2, object_size/2, list/2, array_length/2, array_at/3, object_entries/2, pair_entries/2, expected_size_error/3]).
-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(
" Runtime helpers used by generated JSON decoders.\n"
"\n"
" The Gleam fallback uses `gleam/dynamic/decode`. The JavaScript target\n"
" uses direct JS checks to avoid paying the dynamic decoder cost for every\n"
" envelope, constructor, and field lookup.\n"
).
-file("src/libero/json/runtime.gleam", 16).
-spec field(gleam@dynamic:dynamic_(), binary(), binary()) -> {ok,
gleam@dynamic:dynamic_()} |
{error, list(libero@json@error:json_error())}.
field(Value, Name, Path) ->
case gleam@dynamic@decode:run(
Value,
gleam@dynamic@decode:field(
Name,
{decoder, fun gleam@dynamic@decode:decode_dynamic/1},
fun gleam@dynamic@decode:success/1
)
) of
{ok, Raw} ->
{ok, Raw};
{error, _} ->
{error, [{json_error, Path, <<"missing"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 28).
-spec field_string(gleam@dynamic:dynamic_(), binary(), binary()) -> {ok,
binary()} |
{error, list(libero@json@error:json_error())}.
field_string(Value, Name, Path) ->
case gleam@dynamic@decode:run(
Value,
gleam@dynamic@decode:field(
Name,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun gleam@dynamic@decode:success/1
)
) of
{ok, Raw} ->
{ok, Raw};
{error, _} ->
{error, [{json_error, Path, <<"missing or not a string"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 40).
-spec string(gleam@dynamic:dynamic_(), binary()) -> {ok, binary()} |
{error, list(libero@json@error:json_error())}.
string(Value, Path) ->
case gleam@dynamic@decode:run(
Value,
{decoder, fun gleam@dynamic@decode:decode_string/1}
) of
{ok, Raw} ->
{ok, Raw};
{error, _} ->
{error, [{json_error, Path, <<"expected String"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 51).
-spec int(gleam@dynamic:dynamic_(), binary()) -> {ok, integer()} |
{error, list(libero@json@error:json_error())}.
int(Value, Path) ->
case gleam@dynamic@decode:run(
Value,
{decoder, fun gleam@dynamic@decode:decode_int/1}
) of
{ok, Raw} ->
case (Raw >= -9007199254740991) andalso (Raw =< 9007199254740991) of
true ->
{ok, Raw};
false ->
{error,
[{json_error,
Path,
<<"expected Int in safe JSON range"/utf8>>}]}
end;
{error, _} ->
{error, [{json_error, Path, <<"expected Int"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 66).
-spec float(gleam@dynamic:dynamic_(), binary()) -> {ok, float()} |
{error, list(libero@json@error:json_error())}.
float(Value, Path) ->
case gleam@dynamic@decode:run(
Value,
{decoder, fun gleam@dynamic@decode:decode_float/1}
) of
{ok, Raw} ->
{ok, Raw};
{error, _} ->
{error, [{json_error, Path, <<"expected Float"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 77).
-spec bool(gleam@dynamic:dynamic_(), binary()) -> {ok, boolean()} |
{error, list(libero@json@error:json_error())}.
bool(Value, Path) ->
case gleam@dynamic@decode:run(
Value,
{decoder, fun gleam@dynamic@decode:decode_bool/1}
) of
{ok, Raw} ->
{ok, Raw};
{error, _} ->
{error, [{json_error, Path, <<"expected Bool"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 88).
-spec nil(gleam@dynamic:dynamic_(), binary()) -> {ok, nil} |
{error, list(libero@json@error:json_error())}.
nil(Value, Path) ->
case gleam@dynamic@decode:run(
Value,
gleam@dynamic@decode:optional(
{decoder, fun gleam@dynamic@decode:decode_dynamic/1}
)
) of
{ok, none} ->
{ok, nil};
{ok, {some, _}} ->
{error, [{json_error, Path, <<"expected null"/utf8>>}]};
{error, _} ->
{error, [{json_error, Path, <<"expected null"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 100).
-spec object_size(gleam@dynamic:dynamic_(), binary()) -> {ok, integer()} |
{error, list(libero@json@error:json_error())}.
object_size(Value, Path) ->
case gleam@dynamic@decode:run(
Value,
gleam@dynamic@decode:dict(
{decoder, fun gleam@dynamic@decode:decode_string/1},
{decoder, fun gleam@dynamic@decode:decode_dynamic/1}
)
) of
{ok, Field_map} ->
{ok, maps:size(Field_map)};
{error, _} ->
{error, [{json_error, Path, <<"expected Object"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 122).
-spec list(gleam@dynamic:dynamic_(), binary()) -> {ok,
list(gleam@dynamic:dynamic_())} |
{error, list(libero@json@error:json_error())}.
list(Value, Path) ->
case gleam@dynamic@decode:run(
Value,
gleam@dynamic@decode:list(
{decoder, fun gleam@dynamic@decode:decode_dynamic/1}
)
) of
{ok, Items} ->
{ok, Items};
{error, _} ->
{error, [{json_error, Path, <<"expected Array"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 111).
-spec array_length(gleam@dynamic:dynamic_(), binary()) -> {ok, integer()} |
{error, list(libero@json@error:json_error())}.
array_length(Value, Path) ->
case gleam@dynamic@decode:run(
Value,
gleam@dynamic@decode:list(
{decoder, fun gleam@dynamic@decode:decode_dynamic/1}
)
) of
{ok, Items} ->
{ok, erlang:length(Items)};
{error, _} ->
{error, [{json_error, Path, <<"expected Array"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 133).
-spec array_at(gleam@dynamic:dynamic_(), integer(), binary()) -> {ok,
gleam@dynamic:dynamic_()} |
{error, list(libero@json@error:json_error())}.
array_at(Value, Index, Path) ->
case gleam@dynamic@decode:run(
Value,
gleam@dynamic@decode:list(
{decoder, fun gleam@dynamic@decode:decode_dynamic/1}
)
) of
{ok, Items} ->
case begin
_pipe = gleam@list:drop(Items, Index),
gleam@list:first(_pipe)
end of
{ok, Item} ->
{ok, Item};
{error, _} ->
{error, [{json_error, Path, <<"missing"/utf8>>}]}
end;
{error, _} ->
{error, [{json_error, Path, <<"expected Array"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 149).
-spec object_entries(gleam@dynamic:dynamic_(), binary()) -> {ok,
list({binary(), gleam@dynamic:dynamic_()})} |
{error, list(libero@json@error:json_error())}.
object_entries(Value, Path) ->
case gleam@dynamic@decode:run(
Value,
gleam@dynamic@decode:dict(
{decoder, fun gleam@dynamic@decode:decode_string/1},
{decoder, fun gleam@dynamic@decode:decode_dynamic/1}
)
) of
{ok, Entries} ->
{ok, maps:to_list(Entries)};
{error, _} ->
{error, [{json_error, Path, <<"expected Dict"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 160).
-spec pair_entries(gleam@dynamic:dynamic_(), binary()) -> {ok,
list({gleam@dynamic:dynamic_(), gleam@dynamic:dynamic_()})} |
{error, list(libero@json@error:json_error())}.
pair_entries(Value, Path) ->
case gleam@dynamic@decode:run(
Value,
gleam@dynamic@decode:list(
{decoder, fun gleam@dynamic@decode:decode_dynamic/1}
)
) of
{ok, Pairs_raw} ->
gleam@list:try_map(
Pairs_raw,
fun(Pair_raw) ->
case gleam@dynamic@decode:run(
Pair_raw,
gleam@dynamic@decode:list(
{decoder, fun gleam@dynamic@decode:decode_dynamic/1}
)
) of
{ok, [K_raw, V_raw]} ->
{ok, {K_raw, V_raw}};
{ok, _} ->
{error,
[{json_error,
Path,
<<"expected [key, value] pair"/utf8>>}]};
{error, _} ->
{error,
[{json_error,
Path,
<<"expected Array pair"/utf8>>}]}
end
end
);
{error, _} ->
{error, [{json_error, Path, <<"expected Array of pairs"/utf8>>}]}
end.
-file("src/libero/json/runtime.gleam", 177).
-spec expected_size_error(binary(), integer(), integer()) -> list(libero@json@error:json_error()).
expected_size_error(Path, Expected, Actual) ->
[{json_error,
Path,
<<<<<<"expected "/utf8,
(erlang:integer_to_binary(Expected))/binary>>/binary,
" elements, got "/utf8>>/binary,
(erlang:integer_to_binary(Actual))/binary>>}].