-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, <>); <<"\\"/utf8, Rest@3/binary>> -> do_parse_string(Rest@3, <>); <<"/"/utf8, Rest@4/binary>> -> do_parse_string(Rest@4, <>); <<"b"/utf8, Rest@5/binary>> -> do_parse_string(Rest@5, <>); <<"f"/utf8, Rest@6/binary>> -> do_parse_string(Rest@6, <>); <<"n"/utf8, Rest@7/binary>> -> do_parse_string(Rest@7, <>); <<"r"/utf8, Rest@8/binary>> -> do_parse_string(Rest@8, <>); <<"t"/utf8, Rest@9/binary>> -> do_parse_string(Rest@9, <>); <<"u"/utf8, Rest@10/binary>> -> gleam@result:'try'( parse_hex(Rest@10), fun(_use0) -> {Rest@11, Char} = _use0, do_parse_string( Rest@11, <> ) 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, <>) 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>> -> <>; _ -> <<<>/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 <> when N =:= <<"0"/utf8>> -> do_parse_int(Rest, Allow_leading_zeroes, <>); <> when N =:= <<"1"/utf8>> -> do_parse_int(Rest, Allow_leading_zeroes, <>); <> when N =:= <<"2"/utf8>> -> do_parse_int(Rest, Allow_leading_zeroes, <>); <> when N =:= <<"3"/utf8>> -> do_parse_int(Rest, Allow_leading_zeroes, <>); <> when N =:= <<"4"/utf8>> -> do_parse_int(Rest, Allow_leading_zeroes, <>); <> when N =:= <<"5"/utf8>> -> do_parse_int(Rest, Allow_leading_zeroes, <>); <> when N =:= <<"6"/utf8>> -> do_parse_int(Rest, Allow_leading_zeroes, <>); <> when N =:= <<"7"/utf8>> -> do_parse_int(Rest, Allow_leading_zeroes, <>); <> when N =:= <<"8"/utf8>> -> do_parse_int(Rest, Allow_leading_zeroes, <>); <> when N =:= <<"9"/utf8>> -> do_parse_int(Rest, Allow_leading_zeroes, <>); _ -> 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, <<<> -> <<""/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.