Packages

Native gleam json parser/generator with jsonpath querying

Current section

Files

Jump to
simplejson src simplejson@internal@parser.erl
Raw

src/simplejson@internal@parser.erl

-module(simplejson@internal@parser).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([parse/1]).
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 27).
-spec check_end(binary()) -> boolean().
check_end(Json) ->
case Json of
<<" "/utf8, Rest/binary>> ->
check_end(Rest);
<<"\r"/utf8, Rest/binary>> ->
check_end(Rest);
<<"\n"/utf8, Rest/binary>> ->
check_end(Rest);
<<"\t"/utf8, Rest/binary>> ->
check_end(Rest);
<<""/utf8>> ->
true;
_ ->
false
end.
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 74).
-spec do_trim_whitespace(binary()) -> binary().
do_trim_whitespace(Json) ->
case Json of
<<" "/utf8, Rest/binary>> ->
do_trim_whitespace(Rest);
<<"\r"/utf8, Rest/binary>> ->
do_trim_whitespace(Rest);
<<"\n"/utf8, Rest/binary>> ->
do_trim_whitespace(Rest);
<<"\t"/utf8, Rest/binary>> ->
do_trim_whitespace(Rest);
_ ->
Json
end.
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 195).
-spec parse_hex(binary()) -> {ok, {binary(), binary()}} | {error, nil}.
parse_hex(Json) ->
Hex = gleam@string:slice(Json, 0, 4),
gleam@bool:guard(
gleam@string:length(Hex) < 4,
{error, nil},
fun() ->
Rest = gleam@string:drop_left(Json, 4),
gleam@result:'try'(
gleam@int:base_parse(Hex, 16),
fun(Parsed) -> case Parsed of
65534 ->
{ok, {Rest, <<""/utf8>>}};
65535 ->
{ok, {Rest, <<""/utf8>>}};
_ ->
gleam@result:'try'(
gleam@string:utf_codepoint(Parsed),
fun(Utf8) ->
{ok,
{Rest,
gleam_stdlib:utf_codepoint_list_to_string(
[Utf8]
)}}
end
)
end end
)
end
).
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 133).
-spec do_parse_string(binary(), binary()) -> {ok,
{binary(), simplejson@jsonvalue:json_value()}} |
{error, nil}.
do_parse_string(Json, Str) ->
case Json of
<<"\""/utf8, Rest/binary>> ->
{ok, {Rest, {json_string, Str}}};
<<"\\"/utf8, Rest@1/binary>> ->
case Rest@1 of
<<"\""/utf8, Rest@2/binary>> ->
do_parse_string(Rest@2, <<Str/binary, "\""/utf8>>);
<<"\\"/utf8, Rest@3/binary>> ->
do_parse_string(Rest@3, <<Str/binary, "\\"/utf8>>);
<<"/"/utf8, Rest@4/binary>> ->
do_parse_string(Rest@4, <<Str/binary, "/"/utf8>>);
<<"b"/utf8, Rest@5/binary>> ->
do_parse_string(Rest@5, <<Str/binary, "\x{08}"/utf8>>);
<<"f"/utf8, Rest@6/binary>> ->
do_parse_string(Rest@6, <<Str/binary, "\f"/utf8>>);
<<"n"/utf8, Rest@7/binary>> ->
do_parse_string(Rest@7, <<Str/binary, "\n"/utf8>>);
<<"r"/utf8, Rest@8/binary>> ->
do_parse_string(Rest@8, <<Str/binary, "\r"/utf8>>);
<<"t"/utf8, Rest@9/binary>> ->
do_parse_string(Rest@9, <<Str/binary, "\t"/utf8>>);
<<"u"/utf8, Rest@10/binary>> ->
gleam@result:'try'(
parse_hex(Rest@10),
fun(_use0) ->
{Rest@11, Char} = _use0,
do_parse_string(
Rest@11,
<<Str/binary, Char/binary>>
)
end
);
_ ->
{error, nil}
end;
<<"\x{00}"/utf8, _/binary>> ->
{error, nil};
<<"\x{01}"/utf8, _/binary>> ->
{error, nil};
<<"\x{02}"/utf8, _/binary>> ->
{error, nil};
<<"\x{03}"/utf8, _/binary>> ->
{error, nil};
<<"\x{04}"/utf8, _/binary>> ->
{error, nil};
<<"\x{05}"/utf8, _/binary>> ->
{error, nil};
<<"\x{06}"/utf8, _/binary>> ->
{error, nil};
<<"\x{07}"/utf8, _/binary>> ->
{error, nil};
<<"\x{08}"/utf8, _/binary>> ->
{error, nil};
<<"\x{09}"/utf8, _/binary>> ->
{error, nil};
<<"\x{0A}"/utf8, _/binary>> ->
{error, nil};
<<"\x{0B}"/utf8, _/binary>> ->
{error, nil};
<<"\x{0C}"/utf8, _/binary>> ->
{error, nil};
<<"\x{0D}"/utf8, _/binary>> ->
{error, nil};
<<"\x{0E}"/utf8, _/binary>> ->
{error, nil};
<<"\x{0F}"/utf8, _/binary>> ->
{error, nil};
<<"\x{10}"/utf8, _/binary>> ->
{error, nil};
<<"\x{11}"/utf8, _/binary>> ->
{error, nil};
<<"\x{12}"/utf8, _/binary>> ->
{error, nil};
<<"\x{13}"/utf8, _/binary>> ->
{error, nil};
<<"\x{14}"/utf8, _/binary>> ->
{error, nil};
<<"\x{15}"/utf8, _/binary>> ->
{error, nil};
<<"\x{16}"/utf8, _/binary>> ->
{error, nil};
<<"\x{17}"/utf8, _/binary>> ->
{error, nil};
<<"\x{18}"/utf8, _/binary>> ->
{error, nil};
<<"\x{19}"/utf8, _/binary>> ->
{error, nil};
<<"\x{1A}"/utf8, _/binary>> ->
{error, nil};
<<"\x{1B}"/utf8, _/binary>> ->
{error, nil};
<<"\x{1C}"/utf8, _/binary>> ->
{error, nil};
<<"\x{1D}"/utf8, _/binary>> ->
{error, nil};
<<"\x{1E}"/utf8, _/binary>> ->
{error, nil};
<<"\x{1F}"/utf8, _/binary>> ->
{error, nil};
_ ->
gleam@result:'try'(
gleam@string:pop_grapheme(Json),
fun(_use0@1) ->
{Char@1, Rest@12} = _use0@1,
do_parse_string(Rest@12, <<Str/binary, Char@1/binary>>)
end
)
end.
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 330).
-spec exp2(integer(), integer(), integer()) -> integer().
exp2(Y, X, N) ->
case gleam@int:compare(N, 0) of
eq ->
Y;
lt ->
-999;
gt ->
case gleam@int:is_even(N) of
true ->
exp2(Y, X * X, N div 2);
false ->
exp2(X * Y, X * X, (N - 1) div 2)
end
end.
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 326).
-spec fast_exp(integer()) -> integer().
fast_exp(N) ->
exp2(1, 10, N).
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 305).
-spec decode_int(binary(), binary(), integer()) -> integer().
decode_int(Int_val, Fraction, Exp) ->
_assert_subject = gleam@int:parse(Int_val),
{ok, Int_val@1} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"simplejson/internal/parser"/utf8>>,
function => <<"decode_int"/utf8>>,
line => 306})
end,
{Int_val@2, Exp@1} = case Fraction of
<<""/utf8>> ->
{Int_val@1, Exp};
Fraction@1 ->
Fraction_length = gleam@string:length(Fraction@1),
_assert_subject@1 = gleam@int:parse(Fraction@1),
{ok, Fraction@2} = case _assert_subject@1 of
{ok, _} -> _assert_subject@1;
_assert_fail@1 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail@1,
module => <<"simplejson/internal/parser"/utf8>>,
function => <<"decode_int"/utf8>>,
line => 311})
end,
{(Int_val@1 * fast_exp(Fraction_length)) + Fraction@2,
Exp - Fraction_length}
end,
case Exp@1 < 0 of
true ->
case fast_exp(- Exp@1) of
0 -> 0;
Gleam@denominator -> Int_val@2 div Gleam@denominator
end;
false ->
Int_val@2 * fast_exp(Exp@1)
end.
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 343).
-spec decode_float(binary(), binary(), integer()) -> float().
decode_float(Int_val, Fraction, Exp) ->
Float_val = case Fraction of
<<""/utf8>> ->
<<Int_val/binary, ".0"/utf8>>;
_ ->
<<<<Int_val/binary, "."/utf8>>/binary, Fraction/binary>>
end,
_assert_subject = gleam@float:parse(Float_val),
{ok, Float_val@1} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"simplejson/internal/parser"/utf8>>,
function => <<"decode_float"/utf8>>,
line => 348})
end,
case gleam@int:compare(Exp, 0) of
eq ->
Float_val@1;
gt ->
Float_val@1 * gleam@int:to_float(fast_exp(Exp));
lt ->
_assert_subject@1 = gleam@int:power(10, gleam@int:to_float(Exp)),
{ok, Mult} = case _assert_subject@1 of
{ok, _} -> _assert_subject@1;
_assert_fail@1 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail@1,
module => <<"simplejson/internal/parser"/utf8>>,
function => <<"decode_float"/utf8>>,
line => 355})
end,
Float_val@1 * Mult
end.
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 372).
-spec do_parse_int(binary(), boolean(), binary()) -> {ok, {binary(), binary()}} |
{error, nil}.
do_parse_int(Json, Allow_leading_zeroes, Num) ->
case Json of
<<N:1/binary, Rest/binary>> when N =:= <<"0"/utf8>> ->
do_parse_int(Rest, Allow_leading_zeroes, <<Num/binary, N/binary>>);
<<N:1/binary, Rest/binary>> when N =:= <<"1"/utf8>> ->
do_parse_int(Rest, Allow_leading_zeroes, <<Num/binary, N/binary>>);
<<N:1/binary, Rest/binary>> when N =:= <<"2"/utf8>> ->
do_parse_int(Rest, Allow_leading_zeroes, <<Num/binary, N/binary>>);
<<N:1/binary, Rest/binary>> when N =:= <<"3"/utf8>> ->
do_parse_int(Rest, Allow_leading_zeroes, <<Num/binary, N/binary>>);
<<N:1/binary, Rest/binary>> when N =:= <<"4"/utf8>> ->
do_parse_int(Rest, Allow_leading_zeroes, <<Num/binary, N/binary>>);
<<N:1/binary, Rest/binary>> when N =:= <<"5"/utf8>> ->
do_parse_int(Rest, Allow_leading_zeroes, <<Num/binary, N/binary>>);
<<N:1/binary, Rest/binary>> when N =:= <<"6"/utf8>> ->
do_parse_int(Rest, Allow_leading_zeroes, <<Num/binary, N/binary>>);
<<N:1/binary, Rest/binary>> when N =:= <<"7"/utf8>> ->
do_parse_int(Rest, Allow_leading_zeroes, <<Num/binary, N/binary>>);
<<N:1/binary, Rest/binary>> when N =:= <<"8"/utf8>> ->
do_parse_int(Rest, Allow_leading_zeroes, <<Num/binary, N/binary>>);
<<N:1/binary, Rest/binary>> when N =:= <<"9"/utf8>> ->
do_parse_int(Rest, Allow_leading_zeroes, <<Num/binary, N/binary>>);
_ ->
case Num of
<<""/utf8>> ->
{error, nil};
<<"-"/utf8>> ->
{error, nil};
_ ->
case (Allow_leading_zeroes orelse (Num =:= <<"0"/utf8>>))
orelse (Num =:= <<"-0"/utf8>>) of
true ->
{ok, {Json, Num}};
false ->
case gleam@string:starts_with(Num, <<"0"/utf8>>)
orelse gleam@string:starts_with(Num, <<"-0"/utf8>>) of
true ->
{error, nil};
false ->
{ok, {Json, Num}}
end
end
end
end.
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 362).
-spec do_parse_exponent(binary()) -> {ok, {binary(), binary()}} | {error, nil}.
do_parse_exponent(Json) ->
gleam@result:'try'(case Json of
<<"+"/utf8, Rest/binary>> ->
do_parse_int(Rest, true, <<""/utf8>>);
<<"-"/utf8, Rest@1/binary>> ->
do_parse_int(Rest@1, true, <<"-"/utf8>>);
_ ->
do_parse_int(Json, true, <<""/utf8>>)
end, fun(_use0) ->
{Json@1, Exp} = _use0,
{ok, {Json@1, Exp}}
end).
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 237).
-spec do_parse_number(binary()) -> {ok,
{binary(), simplejson@jsonvalue:json_value()}} |
{error, nil}.
do_parse_number(Json) ->
gleam@result:'try'(case Json of
<<"-"/utf8, Rest/binary>> ->
do_parse_int(Rest, false, <<"-"/utf8>>);
_ ->
do_parse_int(Json, false, <<""/utf8>>)
end, fun(_use0) ->
{Json@1, Num} = _use0,
gleam@result:'try'(case Json@1 of
<<"."/utf8, Rest@1/binary>> ->
do_parse_int(Rest@1, true, <<""/utf8>>);
_ ->
{ok, {Json@1, <<""/utf8>>}}
end, fun(_use0@1) ->
{Json@2, Fraction} = _use0@1,
gleam@result:'try'(case Json@2 of
<<"e"/utf8, Rest@2/binary>> ->
do_parse_exponent(Rest@2);
<<"E"/utf8, Rest@2/binary>> ->
do_parse_exponent(Rest@2);
_ ->
{ok, {Json@2, <<""/utf8>>}}
end, fun(_use0@2) ->
{Json@3, Exp} = _use0@2,
Original = {some, <<<<Num/binary, ((case Fraction of
<<""/utf8>> ->
<<""/utf8>>;
_ ->
<<"."/utf8, Fraction/binary>>
end))/binary>>/binary, ((case Exp of
<<""/utf8>> ->
<<""/utf8>>;
_ ->
<<"e"/utf8, Exp/binary>>
end))/binary>>},
Ret = case {Fraction, Exp} of
{<<""/utf8>>, <<""/utf8>>} ->
{json_number,
{some, decode_int(Num, <<""/utf8>>, 0)},
none,
Original};
{<<""/utf8>>, <<"-"/utf8, Exp@1/binary>>} ->
_assert_subject = gleam@int:parse(Exp@1),
{ok, Exp@2} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(
#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"simplejson/internal/parser"/utf8>>,
function => <<"do_parse_number"/utf8>>,
line => 275}
)
end,
case gleam@string:ends_with(
Num,
gleam@string:repeat(<<"0"/utf8>>, Exp@2)
) of
true ->
{json_number,
{some,
decode_int(
Num,
<<""/utf8>>,
- Exp@2
)},
none,
Original};
false ->
{json_number,
none,
{some,
decode_float(
Num,
Fraction,
- Exp@2
)},
Original}
end;
{<<""/utf8>>, <<"+"/utf8, Exp@3/binary>>} ->
_assert_subject@1 = gleam@int:parse(Exp@3),
{ok, Exp@4} = case _assert_subject@1 of
{ok, _} -> _assert_subject@1;
_assert_fail@1 ->
erlang:error(
#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail@1,
module => <<"simplejson/internal/parser"/utf8>>,
function => <<"do_parse_number"/utf8>>,
line => 283}
)
end,
{json_number,
{some,
decode_int(Num, <<""/utf8>>, Exp@4)},
none,
Original};
{<<""/utf8>>, Exp@3} ->
_assert_subject@1 = gleam@int:parse(Exp@3),
{ok, Exp@4} = case _assert_subject@1 of
{ok, _} -> _assert_subject@1;
_assert_fail@1 ->
erlang:error(
#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail@1,
module => <<"simplejson/internal/parser"/utf8>>,
function => <<"do_parse_number"/utf8>>,
line => 283}
)
end,
{json_number,
{some,
decode_int(Num, <<""/utf8>>, Exp@4)},
none,
Original};
{_, <<""/utf8>>} ->
{json_number,
none,
{some, decode_float(Num, Fraction, 0)},
Original};
{_, <<"-"/utf8, Exp@5/binary>>} ->
_assert_subject@2 = gleam@int:parse(Exp@5),
{ok, Exp@6} = case _assert_subject@2 of
{ok, _} -> _assert_subject@2;
_assert_fail@2 ->
erlang:error(
#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail@2,
module => <<"simplejson/internal/parser"/utf8>>,
function => <<"do_parse_number"/utf8>>,
line => 288}
)
end,
{json_number,
none,
{some,
decode_float(Num, Fraction, - Exp@6)},
Original};
{_, <<"+"/utf8, Exp@7/binary>>} ->
_assert_subject@3 = gleam@int:parse(Exp@7),
{ok, Exp@8} = case _assert_subject@3 of
{ok, _} -> _assert_subject@3;
_assert_fail@3 ->
erlang:error(
#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail@3,
module => <<"simplejson/internal/parser"/utf8>>,
function => <<"do_parse_number"/utf8>>,
line => 292}
)
end,
Fraction_length = gleam@string:length(
Fraction
),
case Exp@8 >= Fraction_length of
true ->
{json_number,
{some,
decode_int(
Num,
Fraction,
Exp@8
)},
none,
Original};
false ->
{json_number,
none,
{some,
decode_float(
Num,
Fraction,
Exp@8
)},
Original}
end;
{_, Exp@7} ->
_assert_subject@3 = gleam@int:parse(Exp@7),
{ok, Exp@8} = case _assert_subject@3 of
{ok, _} -> _assert_subject@3;
_assert_fail@3 ->
erlang:error(
#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail@3,
module => <<"simplejson/internal/parser"/utf8>>,
function => <<"do_parse_number"/utf8>>,
line => 292}
)
end,
Fraction_length = gleam@string:length(
Fraction
),
case Exp@8 >= Fraction_length of
true ->
{json_number,
{some,
decode_int(
Num,
Fraction,
Exp@8
)},
none,
Original};
false ->
{json_number,
none,
{some,
decode_float(
Num,
Fraction,
Exp@8
)},
Original}
end
end,
{ok, {Json@3, Ret}}
end)
end)
end).
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 82).
-spec do_parse_object(
binary(),
gleam@dict:dict(binary(), simplejson@jsonvalue:json_value()),
gleam@option:option({gleam@option:option(nil),
gleam@option:option(binary()),
gleam@option:option(simplejson@jsonvalue:json_value())})
) -> {ok, {binary(), simplejson@jsonvalue:json_value()}} | {error, nil}.
do_parse_object(Json, Obj, Last_entry) ->
case do_trim_whitespace(Json) of
<<"}"/utf8, Rest/binary>> ->
case Last_entry of
none ->
{ok, {Rest, {json_object, Obj}}};
{some, {none, none, none}} ->
{ok, {Rest, {json_object, Obj}}};
_ ->
{error, nil}
end;
<<"\""/utf8, Rest@1/binary>> ->
case Last_entry of
none ->
case do_parse_string(Rest@1, <<""/utf8>>) of
{ok, {Rest@2, {json_string, Key}}} ->
do_parse_object(
Rest@2,
Obj,
{some, {{some, nil}, {some, Key}, none}}
);
_ ->
{error, nil}
end;
{some, {{some, nil}, none, none}} ->
case do_parse_string(Rest@1, <<""/utf8>>) of
{ok, {Rest@2, {json_string, Key}}} ->
do_parse_object(
Rest@2,
Obj,
{some, {{some, nil}, {some, Key}, none}}
);
_ ->
{error, nil}
end;
_ ->
{error, nil}
end;
<<":"/utf8, Rest@3/binary>> ->
case Last_entry of
{some, {{some, nil}, {some, Key@1}, none}} ->
gleam@result:'try'(
do_parse(Rest@3),
fun(_use0) ->
{Rest@4, Value} = _use0,
do_parse_object(
Rest@4,
gleam@dict:insert(Obj, Key@1, Value),
{some, {none, none, none}}
)
end
);
_ ->
{error, nil}
end;
<<","/utf8, Rest@5/binary>> ->
case Last_entry of
{some, {none, none, none}} ->
do_parse_object(
Rest@5,
Obj,
{some, {{some, nil}, none, none}}
);
_ ->
{error, nil}
end;
_ ->
{error, nil}
end.
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 35).
-spec do_parse(binary()) -> {ok, {binary(), simplejson@jsonvalue:json_value()}} |
{error, nil}.
do_parse(Json) ->
Json@1 = do_trim_whitespace(Json),
case Json@1 of
<<"["/utf8, Rest/binary>> ->
do_parse_list(Rest, [], none);
<<"{"/utf8, Rest@1/binary>> ->
do_parse_object(Rest@1, gleam@dict:new(), none);
<<"\""/utf8, Rest@2/binary>> ->
do_parse_string(Rest@2, <<""/utf8>>);
<<"true"/utf8, Rest@3/binary>> ->
{ok, {Rest@3, {json_bool, true}}};
<<"false"/utf8, Rest@4/binary>> ->
{ok, {Rest@4, {json_bool, false}}};
<<"null"/utf8, Rest@5/binary>> ->
{ok, {Rest@5, json_null}};
<<"-"/utf8, _/binary>> ->
do_parse_number(Json@1);
<<"0"/utf8, _/binary>> ->
do_parse_number(Json@1);
<<"1"/utf8, _/binary>> ->
do_parse_number(Json@1);
<<"2"/utf8, _/binary>> ->
do_parse_number(Json@1);
<<"3"/utf8, _/binary>> ->
do_parse_number(Json@1);
<<"4"/utf8, _/binary>> ->
do_parse_number(Json@1);
<<"5"/utf8, _/binary>> ->
do_parse_number(Json@1);
<<"6"/utf8, _/binary>> ->
do_parse_number(Json@1);
<<"7"/utf8, _/binary>> ->
do_parse_number(Json@1);
<<"8"/utf8, _/binary>> ->
do_parse_number(Json@1);
<<"9"/utf8, _/binary>> ->
do_parse_number(Json@1);
_ ->
{error, nil}
end.
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 15).
-spec parse(binary()) -> {ok, simplejson@jsonvalue:json_value()} | {error, nil}.
parse(Json) ->
case do_parse(Json) of
{ok, {Rest, Json_value}} ->
case check_end(Rest) of
false ->
{error, nil};
true ->
{ok, Json_value}
end;
_ ->
{error, nil}
end.
-file("/Users/gareth/Development/gleam/simplejson/src/simplejson/internal/parser.gleam", 209).
-spec do_parse_list(
binary(),
list(simplejson@jsonvalue:json_value()),
gleam@option:option(simplejson@jsonvalue:json_value())
) -> {ok, {binary(), simplejson@jsonvalue:json_value()}} | {error, nil}.
do_parse_list(Json, List, Last_value) ->
case do_trim_whitespace(Json) of
<<"]"/utf8, Rest/binary>> ->
{ok, {Rest, {json_array, lists:reverse(List)}}};
<<","/utf8, Rest@1/binary>> ->
case Last_value of
none ->
{error, nil};
{some, _} ->
gleam@result:'try'(
do_parse(Rest@1),
fun(_use0) ->
{Rest@2, Next_item} = _use0,
do_parse_list(
Rest@2,
[Next_item | List],
{some, Next_item}
)
end
)
end;
_ ->
case Last_value of
none ->
gleam@result:'try'(
do_parse(Json),
fun(_use0@1) ->
{Rest@3, Next_item@1} = _use0@1,
do_parse_list(
Rest@3,
[Next_item@1 | List],
{some, Next_item@1}
)
end
);
{some, _} ->
{error, nil}
end
end.