-module(simplejson@internal@jsonpath). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/simplejson/internal/jsonpath.gleam"). -export([parse_literal_number/1, parse_path/1]). -export_type([selector/0, segment/0, type/0, type_value/0, logical_expression/0, logical_and_expression/0, logical_or_expression/0, literal/0, singular_segment/0, comparable/0, singular_query/0, compare_op/0, test_expression/0, filter/0, function_/0, function_argument/0, defined_function/0, expression/0]). -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(false). -type selector() :: {name, binary()} | wildcard | {index, integer()} | {slice, gleam@option:option(integer()), gleam@option:option(integer()), gleam@option:option(integer())} | {filter, logical_expression()}. -type segment() :: {child, list(selector())} | {descendant, list(selector())}. -type type() :: value | logical | nodes. -type type_value() :: {value_type, literal()} | {logical_type, boolean()} | {nodes_type, list(simplejson@jsonvalue:json_value())}. -type logical_expression() :: {logical_expression, logical_or_expression()}. -type logical_and_expression() :: {logical_and_expression, list(expression())}. -type logical_or_expression() :: {logical_or_expression, list(logical_and_expression())}. -type literal() :: {number, bigdecimal:big_decimal()} | {string, binary()} | {boolean, boolean()} | null | nothing | {object, gleam@dict:dict(binary(), simplejson@jsonvalue:json_value())} | {array, gleam@dict:dict(integer(), simplejson@jsonvalue:json_value())}. -type singular_segment() :: {single_name, binary()} | {single_index, integer()}. -type comparable() :: {literal, literal()} | {query_cmp, singular_query()} | {function_expr_cmp, function_()}. -type singular_query() :: {rel_query, list(singular_segment())} | {abs_query, list(singular_segment())}. -type compare_op() :: eq | not_eq | gt | gte | lt | lte. -type test_expression() :: {filter_query, filter()} | {function_expr, function_()}. -type filter() :: {relative, list(segment())} | {root, list(segment())}. -type function_() :: {function, defined_function(), list(function_argument())}. -type function_argument() :: {literal_arg, literal()} | {query_arg, filter()} | {query_singular_arg, filter()} | {logical_arg, logical_expression()} | {function_arg, function_()}. -type defined_function() :: count | length | match | search | value_of | {unknown, binary()}. -type expression() :: {paren, logical_expression(), boolean()} | {comparison, comparable(), comparable(), compare_op()} | {test, test_expression(), boolean()}. -file("src/simplejson/internal/jsonpath.gleam", 86). ?DOC(false). -spec member_name_to_selector( fun((binary()) -> {ok, {binary(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}) ) -> fun((binary()) -> {ok, {selector(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}). member_name_to_selector(F) -> fun(Str) -> case F(Str) of {ok, {Name, Rest}} -> {ok, {{name, Name}, Rest}}; {error, A} -> {error, A} end end. -file("src/simplejson/internal/jsonpath.gleam", 97). ?DOC(false). -spec selector_to_segment( {ok, {list(selector()), binary()}} | {error, simplejson@jsonvalue:json_path_error()}, fun((list(selector())) -> segment()) ) -> {ok, {segment(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. selector_to_segment(Res, Seg) -> case Res of {ok, {Sel, Rest}} -> {ok, {Seg(Sel), Rest}}; {error, E} -> {error, E} end. -file("src/simplejson/internal/jsonpath.gleam", 107). ?DOC(false). -spec selector_to_selectors( fun((binary()) -> {ok, {selector(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}) ) -> fun((binary()) -> {ok, {list(selector()), binary()}} | {error, simplejson@jsonvalue:json_path_error()}). selector_to_selectors(Res) -> fun(Str) -> gleam@result:map( Res(Str), fun(R) -> {[erlang:element(1, R)], erlang:element(2, R)} end ) end. -file("src/simplejson/internal/jsonpath.gleam", 133). ?DOC(false). -spec parse_wildcard_selector(binary()) -> {ok, {selector(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_wildcard_selector(Str) -> case Str of <<"*"/utf8, Rest/binary>> -> {ok, {wildcard, Rest}}; _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 179). ?DOC(false). -spec try_options( list(fun((binary()) -> {ok, {PHN, PHO}} | {error, simplejson@jsonvalue:json_path_error()})), binary() ) -> {ok, {PHN, PHO}} | {error, simplejson@jsonvalue:json_path_error()}. try_options(Options, Str) -> gleam@list:fold_until( Options, {error, no_match}, fun(_, Parsefn) -> case Parsefn(Str) of {error, no_match} -> {continue, {error, no_match}}; {error, E} -> {stop, {error, E}}; {ok, {Expr, Str@1}} -> {stop, {ok, {Expr, Str@1}}} end end ). -file("src/simplejson/internal/jsonpath.gleam", 353). ?DOC(false). -spec is_name_first(binary()) -> boolean(). is_name_first(Char) -> gleam@bool:guard( Char =:= <<"_"/utf8>>, true, fun() -> _pipe = gleam@string:to_utf_codepoints(Char), gleam@list:fold_until( _pipe, true, fun(_, Codepoint) -> Cpi = gleam_stdlib:identity(Codepoint), case Cpi of _ when (Cpi >= 16#41) andalso (Cpi =< 16#5A) -> {continue, true}; _ when (Cpi >= 16#61) andalso (Cpi =< 16#7A) -> {continue, true}; _ when (Cpi >= 16#80) andalso (Cpi =< 16#D7FF) -> {continue, true}; _ when (Cpi >= 16#E0000) andalso (Cpi =< 16#10FFFF) -> {continue, true}; _ -> {stop, false} end end ) end ). -file("src/simplejson/internal/jsonpath.gleam", 376). ?DOC(false). -spec valid_literal_char(integer()) -> boolean(). valid_literal_char(Cpi) -> case Cpi of 16#20 -> true; 16#21 -> true; 16#23 -> true; 16#24 -> true; 16#25 -> true; 16#26 -> true; _ when (Cpi >= 16#28) andalso (Cpi =< 16#5B) -> true; _ when (Cpi >= 16#5D) andalso (Cpi =< 16#D7FF) -> true; _ when (Cpi >= 16#E000) andalso (Cpi =< 16#10FFFF) -> true; _ -> false end. -file("src/simplejson/internal/jsonpath.gleam", 453). ?DOC(false). -spec convert_surrogate(binary(), binary()) -> {ok, integer()} | {error, simplejson@jsonvalue:json_path_error()}. convert_surrogate(High, Low) -> gleam@result:'try'( begin _pipe = gleam@int:base_parse(High, 16), gleam@result:replace_error( _pipe, {parse_error, <<"convert_surrogate 1"/utf8>>} ) end, fun(High@1) -> gleam@result:'try'( begin _pipe@1 = gleam@int:base_parse(Low, 16), gleam@result:replace_error( _pipe@1, {parse_error, <<"convert_surrogate 2"/utf8>>} ) end, fun(Low@1) -> {ok, ((High@1 - 16#D800) * 16#400) + ((Low@1 - 16#DC00) + 16#10000)} end ) end ). -file("src/simplejson/internal/jsonpath.gleam", 481). ?DOC(false). -spec parse_hex_digit(binary(), integer()) -> {ok, {binary(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_hex_digit(Str, Num) -> _pipe = gleam@list:repeat(0, Num), gleam@list:try_fold( _pipe, {<<""/utf8>>, Str}, fun(Acc, _) -> {Hex, Str2} = Acc, case Str2 of <<""/utf8>> -> {error, {parse_error, <<"parse_hex_digit 1"/utf8>>}}; <> when Char =:= <<"0"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"1"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"2"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"3"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"4"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"5"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"6"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"7"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"8"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"9"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"a"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"b"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"c"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"d"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"e"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"f"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"A"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"B"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"C"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"D"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"E"/utf8>> -> {ok, {<>, Rest}}; <> when Char =:= <<"F"/utf8>> -> {ok, {<>, Rest}}; _ -> {error, {parse_error, <<"parse_hex_digit 2"/utf8>>}} end end ). -file("src/simplejson/internal/jsonpath.gleam", 466). ?DOC(false). -spec parse_low_surrogate(binary()) -> {ok, {binary(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_low_surrogate(Str) -> case Str of <<"\\u"/utf8, Rest/binary>> -> gleam@result:'try'( parse_hex_digit(Rest, 4), fun(_use0) -> {Hex, Rest@1} = _use0, case string:lowercase(Hex) of <<"dc"/utf8, _/binary>> -> {ok, {Hex, Rest@1}}; <<"dd"/utf8, _/binary>> -> {ok, {Hex, Rest@1}}; <<"de"/utf8, _/binary>> -> {ok, {Hex, Rest@1}}; <<"df"/utf8, _/binary>> -> {ok, {Hex, Rest@1}}; _ -> {error, {parse_error, <<"parse_low_surrogate 1"/utf8>>}} end end ); _ -> {error, {parse_error, <<"parse_low_surrogate 2"/utf8>>}} end. -file("src/simplejson/internal/jsonpath.gleam", 517). ?DOC(false). -spec decode_non_surrogate(binary()) -> {ok, binary()} | {error, simplejson@jsonvalue:json_path_error()}. decode_non_surrogate(Hex) -> gleam@result:'try'( begin _pipe = gleam@int:base_parse(Hex, 16), gleam@result:replace_error( _pipe, {parse_error, <<"decode_non_surrogate 1"/utf8>>} ) end, fun(I) -> gleam@result:'try'( begin _pipe@1 = gleam@string:utf_codepoint(I), gleam@result:replace_error( _pipe@1, {parse_error, <<"decode_non_surrogate 2"/utf8>>} ) end, fun(Codepoint) -> {ok, gleam_stdlib:utf_codepoint_list_to_string([Codepoint])} end ) end ). -file("src/simplejson/internal/jsonpath.gleam", 386). ?DOC(false). -spec do_parse_hexchar(binary()) -> {ok, {binary(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_hexchar(Str) -> case Str of <<""/utf8>> -> {error, {parse_error, <<"do_parse_hexchar 1"/utf8>>}}; <> when Char =:= <<"0"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"1"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"2"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"3"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"4"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"5"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"6"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"7"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"8"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"9"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"a"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"b"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"c"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"e"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"f"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"A"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"B"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"C"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"E"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char =:= <<"F"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest, 3), fun(_use0) -> {Hex, Rest@1} = _use0, gleam@result:'try'( decode_non_surrogate(<>), fun(Ns) -> {ok, {Ns, Rest@1}} end ) end ); <> when Char@1 =:= <<"d"/utf8>> -> case Rest@2 of <<""/utf8>> -> {error, {parse_error, <<"do_parse_hexchar 2"/utf8>>}}; <> when Char2 =:= <<"0"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"1"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"2"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"3"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"4"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"5"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"6"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"7"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2@1 =:= <<"8"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@5, 2), fun(_use0@2) -> {Hex@2, Rest@6} = _use0@2, gleam@result:'try'( parse_low_surrogate(Rest@6), fun(_use0@3) -> {Low, Rest@7} = _use0@3, gleam@result:'try'( convert_surrogate( <<<>/binary, Hex@2/binary>>, Low ), fun(Codepoint) -> gleam@result:'try'( begin _pipe = gleam@string:utf_codepoint( Codepoint ), gleam@result:replace_error( _pipe, {parse_error, <<"do_parse_hexchar 3"/utf8>>} ) end, fun(Codepoint@1) -> {ok, {gleam_stdlib:utf_codepoint_list_to_string( [Codepoint@1] ), Rest@7}} end ) end ) end ) end ); <> when Char2@1 =:= <<"9"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@5, 2), fun(_use0@2) -> {Hex@2, Rest@6} = _use0@2, gleam@result:'try'( parse_low_surrogate(Rest@6), fun(_use0@3) -> {Low, Rest@7} = _use0@3, gleam@result:'try'( convert_surrogate( <<<>/binary, Hex@2/binary>>, Low ), fun(Codepoint) -> gleam@result:'try'( begin _pipe = gleam@string:utf_codepoint( Codepoint ), gleam@result:replace_error( _pipe, {parse_error, <<"do_parse_hexchar 3"/utf8>>} ) end, fun(Codepoint@1) -> {ok, {gleam_stdlib:utf_codepoint_list_to_string( [Codepoint@1] ), Rest@7}} end ) end ) end ) end ); <> when Char2@1 =:= <<"a"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@5, 2), fun(_use0@2) -> {Hex@2, Rest@6} = _use0@2, gleam@result:'try'( parse_low_surrogate(Rest@6), fun(_use0@3) -> {Low, Rest@7} = _use0@3, gleam@result:'try'( convert_surrogate( <<<>/binary, Hex@2/binary>>, Low ), fun(Codepoint) -> gleam@result:'try'( begin _pipe = gleam@string:utf_codepoint( Codepoint ), gleam@result:replace_error( _pipe, {parse_error, <<"do_parse_hexchar 3"/utf8>>} ) end, fun(Codepoint@1) -> {ok, {gleam_stdlib:utf_codepoint_list_to_string( [Codepoint@1] ), Rest@7}} end ) end ) end ) end ); <> when Char2@1 =:= <<"b"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@5, 2), fun(_use0@2) -> {Hex@2, Rest@6} = _use0@2, gleam@result:'try'( parse_low_surrogate(Rest@6), fun(_use0@3) -> {Low, Rest@7} = _use0@3, gleam@result:'try'( convert_surrogate( <<<>/binary, Hex@2/binary>>, Low ), fun(Codepoint) -> gleam@result:'try'( begin _pipe = gleam@string:utf_codepoint( Codepoint ), gleam@result:replace_error( _pipe, {parse_error, <<"do_parse_hexchar 3"/utf8>>} ) end, fun(Codepoint@1) -> {ok, {gleam_stdlib:utf_codepoint_list_to_string( [Codepoint@1] ), Rest@7}} end ) end ) end ) end ); <> when Char2@1 =:= <<"A"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@5, 2), fun(_use0@2) -> {Hex@2, Rest@6} = _use0@2, gleam@result:'try'( parse_low_surrogate(Rest@6), fun(_use0@3) -> {Low, Rest@7} = _use0@3, gleam@result:'try'( convert_surrogate( <<<>/binary, Hex@2/binary>>, Low ), fun(Codepoint) -> gleam@result:'try'( begin _pipe = gleam@string:utf_codepoint( Codepoint ), gleam@result:replace_error( _pipe, {parse_error, <<"do_parse_hexchar 3"/utf8>>} ) end, fun(Codepoint@1) -> {ok, {gleam_stdlib:utf_codepoint_list_to_string( [Codepoint@1] ), Rest@7}} end ) end ) end ) end ); <> when Char2@1 =:= <<"B"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@5, 2), fun(_use0@2) -> {Hex@2, Rest@6} = _use0@2, gleam@result:'try'( parse_low_surrogate(Rest@6), fun(_use0@3) -> {Low, Rest@7} = _use0@3, gleam@result:'try'( convert_surrogate( <<<>/binary, Hex@2/binary>>, Low ), fun(Codepoint) -> gleam@result:'try'( begin _pipe = gleam@string:utf_codepoint( Codepoint ), gleam@result:replace_error( _pipe, {parse_error, <<"do_parse_hexchar 3"/utf8>>} ) end, fun(Codepoint@1) -> {ok, {gleam_stdlib:utf_codepoint_list_to_string( [Codepoint@1] ), Rest@7}} end ) end ) end ) end ); _ -> {error, {parse_error, <<"do_parse_hexchar 4"/utf8>>}} end; <> when Char@1 =:= <<"D"/utf8>> -> case Rest@2 of <<""/utf8>> -> {error, {parse_error, <<"do_parse_hexchar 2"/utf8>>}}; <> when Char2 =:= <<"0"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"1"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"2"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"3"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"4"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"5"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"6"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2 =:= <<"7"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@3, 2), fun(_use0@1) -> {Hex@1, Rest@4} = _use0@1, gleam@result:'try'( decode_non_surrogate( <<<>/binary, Hex@1/binary>> ), fun(Ns@1) -> {ok, {Ns@1, Rest@4}} end ) end ); <> when Char2@1 =:= <<"8"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@5, 2), fun(_use0@2) -> {Hex@2, Rest@6} = _use0@2, gleam@result:'try'( parse_low_surrogate(Rest@6), fun(_use0@3) -> {Low, Rest@7} = _use0@3, gleam@result:'try'( convert_surrogate( <<<>/binary, Hex@2/binary>>, Low ), fun(Codepoint) -> gleam@result:'try'( begin _pipe = gleam@string:utf_codepoint( Codepoint ), gleam@result:replace_error( _pipe, {parse_error, <<"do_parse_hexchar 3"/utf8>>} ) end, fun(Codepoint@1) -> {ok, {gleam_stdlib:utf_codepoint_list_to_string( [Codepoint@1] ), Rest@7}} end ) end ) end ) end ); <> when Char2@1 =:= <<"9"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@5, 2), fun(_use0@2) -> {Hex@2, Rest@6} = _use0@2, gleam@result:'try'( parse_low_surrogate(Rest@6), fun(_use0@3) -> {Low, Rest@7} = _use0@3, gleam@result:'try'( convert_surrogate( <<<>/binary, Hex@2/binary>>, Low ), fun(Codepoint) -> gleam@result:'try'( begin _pipe = gleam@string:utf_codepoint( Codepoint ), gleam@result:replace_error( _pipe, {parse_error, <<"do_parse_hexchar 3"/utf8>>} ) end, fun(Codepoint@1) -> {ok, {gleam_stdlib:utf_codepoint_list_to_string( [Codepoint@1] ), Rest@7}} end ) end ) end ) end ); <> when Char2@1 =:= <<"a"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@5, 2), fun(_use0@2) -> {Hex@2, Rest@6} = _use0@2, gleam@result:'try'( parse_low_surrogate(Rest@6), fun(_use0@3) -> {Low, Rest@7} = _use0@3, gleam@result:'try'( convert_surrogate( <<<>/binary, Hex@2/binary>>, Low ), fun(Codepoint) -> gleam@result:'try'( begin _pipe = gleam@string:utf_codepoint( Codepoint ), gleam@result:replace_error( _pipe, {parse_error, <<"do_parse_hexchar 3"/utf8>>} ) end, fun(Codepoint@1) -> {ok, {gleam_stdlib:utf_codepoint_list_to_string( [Codepoint@1] ), Rest@7}} end ) end ) end ) end ); <> when Char2@1 =:= <<"b"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@5, 2), fun(_use0@2) -> {Hex@2, Rest@6} = _use0@2, gleam@result:'try'( parse_low_surrogate(Rest@6), fun(_use0@3) -> {Low, Rest@7} = _use0@3, gleam@result:'try'( convert_surrogate( <<<>/binary, Hex@2/binary>>, Low ), fun(Codepoint) -> gleam@result:'try'( begin _pipe = gleam@string:utf_codepoint( Codepoint ), gleam@result:replace_error( _pipe, {parse_error, <<"do_parse_hexchar 3"/utf8>>} ) end, fun(Codepoint@1) -> {ok, {gleam_stdlib:utf_codepoint_list_to_string( [Codepoint@1] ), Rest@7}} end ) end ) end ) end ); <> when Char2@1 =:= <<"A"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@5, 2), fun(_use0@2) -> {Hex@2, Rest@6} = _use0@2, gleam@result:'try'( parse_low_surrogate(Rest@6), fun(_use0@3) -> {Low, Rest@7} = _use0@3, gleam@result:'try'( convert_surrogate( <<<>/binary, Hex@2/binary>>, Low ), fun(Codepoint) -> gleam@result:'try'( begin _pipe = gleam@string:utf_codepoint( Codepoint ), gleam@result:replace_error( _pipe, {parse_error, <<"do_parse_hexchar 3"/utf8>>} ) end, fun(Codepoint@1) -> {ok, {gleam_stdlib:utf_codepoint_list_to_string( [Codepoint@1] ), Rest@7}} end ) end ) end ) end ); <> when Char2@1 =:= <<"B"/utf8>> -> gleam@result:'try'( parse_hex_digit(Rest@5, 2), fun(_use0@2) -> {Hex@2, Rest@6} = _use0@2, gleam@result:'try'( parse_low_surrogate(Rest@6), fun(_use0@3) -> {Low, Rest@7} = _use0@3, gleam@result:'try'( convert_surrogate( <<<>/binary, Hex@2/binary>>, Low ), fun(Codepoint) -> gleam@result:'try'( begin _pipe = gleam@string:utf_codepoint( Codepoint ), gleam@result:replace_error( _pipe, {parse_error, <<"do_parse_hexchar 3"/utf8>>} ) end, fun(Codepoint@1) -> {ok, {gleam_stdlib:utf_codepoint_list_to_string( [Codepoint@1] ), Rest@7}} end ) end ) end ) end ); _ -> {error, {parse_error, <<"do_parse_hexchar 4"/utf8>>}} end; _ -> {error, {parse_error, <<"do_parse_hexchar 5"/utf8>>}} end. -file("src/simplejson/internal/jsonpath.gleam", 263). ?DOC(false). -spec do_parse_string_literal(binary(), binary(), binary()) -> {ok, {binary(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_string_literal(Str, Quote, Literal) -> case gleam_stdlib:string_pop_grapheme(Str) of {error, _} -> {error, {parse_error, <<"do_parse_string_literal1 "/utf8>>}}; {ok, {<<"\""/utf8>>, Rest}} -> case Quote =:= <<"\""/utf8>> of true -> {ok, {Literal, Rest}}; false -> do_parse_string_literal( Rest, Quote, <> ) end; {ok, {<<"'"/utf8>>, Rest@1}} -> case Quote =:= <<"'"/utf8>> of true -> {ok, {Literal, Rest@1}}; false -> do_parse_string_literal( Rest@1, Quote, <> ) end; {ok, {<<"\\"/utf8>>, Rest@2}} -> case Rest@2 of <<"\""/utf8, _/binary>> when Quote =:= <<"'"/utf8>> -> {error, {parse_error, <<"do_parse_string_literal 2"/utf8>>}}; <<"\""/utf8, Rest@3/binary>> -> do_parse_string_literal( Rest@3, Quote, <> ); <<"'"/utf8, _/binary>> when Quote =:= <<"\""/utf8>> -> {error, {parse_error, <<"do_parse_string_literal 3"/utf8>>}}; <<"'"/utf8, Rest@4/binary>> -> do_parse_string_literal( Rest@4, Quote, <> ); <<"b"/utf8, Rest@5/binary>> -> do_parse_string_literal( Rest@5, Quote, <> ); <<"f"/utf8, Rest@6/binary>> -> do_parse_string_literal( Rest@6, Quote, <> ); <<"n"/utf8, Rest@7/binary>> -> do_parse_string_literal( Rest@7, Quote, <> ); <<"r"/utf8, Rest@8/binary>> -> do_parse_string_literal( Rest@8, Quote, <> ); <<"t"/utf8, Rest@9/binary>> -> do_parse_string_literal( Rest@9, Quote, <> ); <<"\\"/utf8, Rest@10/binary>> -> do_parse_string_literal( Rest@10, Quote, <> ); <<"/"/utf8, Rest@11/binary>> -> do_parse_string_literal( Rest@11, Quote, <> ); <<"u"/utf8, Rest@12/binary>> -> gleam@result:'try'( do_parse_hexchar(Rest@12), fun(_use0) -> {Hexchar, Rest@13} = _use0, do_parse_string_literal( Rest@13, Quote, <> ) end ); _ -> {error, {parse_error, <<"do_parse_string_literal 4"/utf8>>}} end; {ok, {Char, Rest@14}} -> case begin _pipe = gleam@string:to_utf_codepoints(Char), gleam@list:fold_until( _pipe, true, fun(_, Codepoint) -> Cpi = gleam_stdlib:identity(Codepoint), case valid_literal_char(Cpi) of true -> {continue, true}; false -> {stop, false} end end ) end of true -> do_parse_string_literal( Rest@14, Quote, <> ); false -> {error, {parse_error, <<"do_parse_string_literal 5"/utf8>>}} end end. -file("src/simplejson/internal/jsonpath.gleam", 254). ?DOC(false). -spec parse_string_literal(binary()) -> {ok, {binary(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_string_literal(Str) -> case Str of <> when Quote =:= <<"\""/utf8>> -> do_parse_string_literal(Rest, Quote, <<""/utf8>>); <> when Quote =:= <<"'"/utf8>> -> do_parse_string_literal(Rest, Quote, <<""/utf8>>); _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 634). ?DOC(false). -spec filter_to_testexpression( fun((binary()) -> {ok, {filter(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}) ) -> fun((binary()) -> {ok, {test_expression(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}). filter_to_testexpression(F) -> fun(Str) -> case F(Str) of {ok, {Lit, Rest}} -> {ok, {{filter_query, Lit}, Rest}}; {error, A} -> {error, A} end end. -file("src/simplejson/internal/jsonpath.gleam", 702). ?DOC(false). -spec name_to_function(binary()) -> defined_function(). name_to_function(Str) -> case Str of <<"count"/utf8>> -> count; <<"length"/utf8>> -> length; <<"match"/utf8>> -> match; <<"search"/utf8>> -> search; <<"value"/utf8>> -> value_of; _ -> {unknown, Str} end. -file("src/simplejson/internal/jsonpath.gleam", 803). ?DOC(false). -spec function_to_arg( fun((binary()) -> {ok, {function_(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}) ) -> fun((binary()) -> {ok, {function_argument(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}). function_to_arg(F) -> fun(Str) -> case F(Str) of {ok, {Filter, Rest}} -> {ok, {{function_arg, Filter}, Rest}}; {error, A} -> {error, A} end end. -file("src/simplejson/internal/jsonpath.gleam", 814). ?DOC(false). -spec logical_to_arg( fun((binary()) -> {ok, {logical_expression(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}) ) -> fun((binary()) -> {ok, {function_argument(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}). logical_to_arg(F) -> fun(Str) -> case F(Str) of {ok, {Filter, Rest}} -> {ok, {{logical_arg, Filter}, Rest}}; {error, A} -> {error, A} end end. -file("src/simplejson/internal/jsonpath.gleam", 852). ?DOC(false). -spec is_singular(filter()) -> boolean(). is_singular(Filter) -> _pipe = gleam@list:find(erlang:element(2, Filter), fun(Seg) -> case Seg of {child, Sels} -> case Sels of [Sel] -> case Sel of {filter, _} -> true; {index, _} -> false; {name, _} -> false; {slice, _, _, _} -> true; wildcard -> true end; _ -> true end; {descendant, Sels} -> case Sels of [Sel] -> case Sel of {filter, _} -> true; {index, _} -> false; {name, _} -> false; {slice, _, _, _} -> true; wildcard -> true end; _ -> true end end end), _pipe@1 = gleam@result:replace(_pipe, false), _pipe@2 = gleam@result:replace_error(_pipe@1, true), gleam@result:unwrap_both(_pipe@2). -file("src/simplejson/internal/jsonpath.gleam", 836). ?DOC(false). -spec filter_to_arg( fun((binary()) -> {ok, {filter(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}) ) -> fun((binary()) -> {ok, {function_argument(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}). filter_to_arg(F) -> fun(Str) -> case F(Str) of {ok, {Filter, Rest}} -> case is_singular(Filter) of true -> {ok, {{query_singular_arg, Filter}, Rest}}; false -> {ok, {{query_arg, Filter}, Rest}} end; {error, A} -> {error, A} end end. -file("src/simplejson/internal/jsonpath.gleam", 876). ?DOC(false). -spec literal_to_arg( fun((binary()) -> {ok, {literal(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}) ) -> fun((binary()) -> {ok, {function_argument(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}). literal_to_arg(F) -> fun(Str) -> case F(Str) of {ok, {Lit, Rest}} -> {ok, {{literal_arg, Lit}, Rest}}; {error, A} -> {error, A} end end. -file("src/simplejson/internal/jsonpath.gleam", 909). ?DOC(false). -spec is_digit(binary()) -> boolean(). is_digit(Char) -> case Char of <<"0"/utf8>> -> true; <<"1"/utf8>> -> true; <<"2"/utf8>> -> true; <<"3"/utf8>> -> true; <<"4"/utf8>> -> true; <<"5"/utf8>> -> true; <<"6"/utf8>> -> true; <<"7"/utf8>> -> true; <<"8"/utf8>> -> true; <<"9"/utf8>> -> true; _ -> false end. -file("src/simplejson/internal/jsonpath.gleam", 369). ?DOC(false). -spec is_name_char(binary()) -> boolean(). is_name_char(Char) -> case is_name_first(Char) of true -> true; false -> is_digit(Char) end. -file("src/simplejson/internal/jsonpath.gleam", 327). ?DOC(false). -spec do_parse_member_name(binary(), binary()) -> {ok, {binary(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_member_name(Str, Name) -> case gleam_stdlib:string_pop_grapheme(Str) of {error, _} when Name =:= <<""/utf8>> -> {error, no_match}; {error, _} -> {ok, {Name, <<""/utf8>>}}; {ok, {Ch, Rest}} -> case Name =:= <<""/utf8>> of true -> case is_name_first(Ch) of true -> do_parse_member_name( Rest, <> ); false -> {error, no_match} end; false -> case is_name_char(Ch) of true -> do_parse_member_name( Rest, <> ); false -> {ok, {Name, Str}} end end end. -file("src/simplejson/internal/jsonpath.gleam", 323). ?DOC(false). -spec parse_member_name(binary()) -> {ok, {binary(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_member_name(Str) -> do_parse_member_name(Str, <<""/utf8>>). -file("src/simplejson/internal/jsonpath.gleam", 916). ?DOC(false). -spec is_lc_alpha(binary()) -> boolean(). is_lc_alpha(Char) -> case gleam@string:to_utf_codepoints(Char) of [U] -> case gleam_stdlib:identity(U) of Ui when (Ui >= 16#61) andalso (Ui =< 16#7A) -> true; _ -> false end; [U | _] -> case gleam_stdlib:identity(U) of Ui when (Ui >= 16#61) andalso (Ui =< 16#7A) -> true; _ -> false end; [] -> false end. -file("src/simplejson/internal/jsonpath.gleam", 887). ?DOC(false). -spec do_parse_function_name(binary(), binary()) -> {ok, {binary(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_function_name(Str, Cur) -> case gleam_stdlib:string_pop_grapheme(Str) of {error, _} -> {error, {parse_error, <<"do_parse_function_name"/utf8>>}}; {ok, {Char, Rest}} -> case is_lc_alpha(Char) of true when Cur =:= <<""/utf8>> -> do_parse_function_name(Rest, Char); true -> do_parse_function_name(Rest, <>); false when Cur =:= <<""/utf8>> -> {error, no_match}; false -> case (Char =:= <<"_"/utf8>>) orelse is_digit(Char) of true -> do_parse_function_name( Rest, <> ); false -> {ok, {Cur, Str}} end end end. -file("src/simplejson/internal/jsonpath.gleam", 961). ?DOC(false). -spec do_parse_comparisonop(binary()) -> {ok, {compare_op(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_comparisonop(Str) -> case Str of <<"=="/utf8, Rest/binary>> -> {ok, {eq, Rest}}; <<">="/utf8, Rest@1/binary>> -> {ok, {gte, Rest@1}}; <<"<="/utf8, Rest@2/binary>> -> {ok, {lte, Rest@2}}; <<"!="/utf8, Rest@3/binary>> -> {ok, {not_eq, Rest@3}}; <<">"/utf8, Rest@4/binary>> -> {ok, {gt, Rest@4}}; <<"<"/utf8, Rest@5/binary>> -> {ok, {lt, Rest@5}}; _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 975). ?DOC(false). -spec literal_to_comparable( fun((binary()) -> {ok, {literal(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}) ) -> fun((binary()) -> {ok, {comparable(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}). literal_to_comparable(F) -> fun(Str) -> case F(Str) of {ok, {Lit, Rest}} -> {ok, {{literal, Lit}, Rest}}; {error, A} -> {error, A} end end. -file("src/simplejson/internal/jsonpath.gleam", 997). ?DOC(false). -spec function_to_comparable( fun((binary()) -> {ok, {function_(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}) ) -> fun((binary()) -> {ok, {comparable(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}). function_to_comparable(F) -> fun(Str) -> case F(Str) of {ok, {Lit, Rest}} -> {ok, {{function_expr_cmp, Lit}, Rest}}; {error, A} -> {error, A} end end. -file("src/simplejson/internal/jsonpath.gleam", 1008). ?DOC(false). -spec singular_to_comparable( fun((binary()) -> {ok, {singular_query(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}) ) -> fun((binary()) -> {ok, {comparable(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}). singular_to_comparable(F) -> fun(Str) -> case F(Str) of {ok, {Lit, Rest}} -> {ok, {{query_cmp, Lit}, Rest}}; {error, A} -> {error, A} end end. -file("src/simplejson/internal/jsonpath.gleam", 1075). ?DOC(false). -spec parse_member_name_segment(binary()) -> {ok, {singular_segment(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_member_name_segment(Str) -> case Str of <<"."/utf8, Rest/binary>> -> gleam@result:'try'( parse_member_name(Rest), fun(_use0) -> {Name, Rest@1} = _use0, {ok, {{single_name, Name}, Rest@1}} end ); _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 1087). ?DOC(false). -spec parse_name_selector_segment(binary()) -> {ok, {singular_segment(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_name_selector_segment(Str) -> case Str of <<"["/utf8, Rest/binary>> -> gleam@result:'try'( parse_string_literal(Rest), fun(_use0) -> {Name, Rest@1} = _use0, case Rest@1 of <<"]"/utf8, Rest@2/binary>> -> {ok, {{single_name, Name}, Rest@2}}; _ -> {error, no_match} end end ); _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 1102). ?DOC(false). -spec string_to_literal( fun((binary()) -> {ok, {binary(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}) ) -> fun((binary()) -> {ok, {literal(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}). string_to_literal(F) -> fun(Str) -> case F(Str) of {ok, {Lit, Rest}} -> {ok, {{string, Lit}, Rest}}; {error, A} -> {error, A} end end. -file("src/simplejson/internal/jsonpath.gleam", 1212). ?DOC(false). -spec get_next_int_as_string(binary(), boolean(), binary()) -> {ok, {binary(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. get_next_int_as_string(Str, Allow_leading, Cur) -> case Str of <<"-"/utf8, Rest/binary>> when Cur =:= <<""/utf8>> -> get_next_int_as_string(Rest, Allow_leading, <<"-"/utf8>>); <<"0"/utf8, Rest@1/binary>> when Cur =:= <<""/utf8>> -> get_next_int_as_string(Rest@1, Allow_leading, <<"0"/utf8>>); <<"0"/utf8, _/binary>> when not Allow_leading andalso (Cur =:= <<"-"/utf8>>) -> {error, {parse_error, <<"get_next_int 1"/utf8>>}}; <<"0"/utf8, _/binary>> when not Allow_leading andalso (Cur =:= <<"0"/utf8>>) -> {error, {parse_error, <<"get_next_int 2"/utf8>>}}; <<"1"/utf8, _/binary>> when not Allow_leading andalso (Cur =:= <<"0"/utf8>>) -> {error, {parse_error, <<"get_next_int 2"/utf8>>}}; <<"2"/utf8, _/binary>> when not Allow_leading andalso (Cur =:= <<"0"/utf8>>) -> {error, {parse_error, <<"get_next_int 2"/utf8>>}}; <<"3"/utf8, _/binary>> when not Allow_leading andalso (Cur =:= <<"0"/utf8>>) -> {error, {parse_error, <<"get_next_int 2"/utf8>>}}; <<"4"/utf8, _/binary>> when not Allow_leading andalso (Cur =:= <<"0"/utf8>>) -> {error, {parse_error, <<"get_next_int 2"/utf8>>}}; <<"5"/utf8, _/binary>> when not Allow_leading andalso (Cur =:= <<"0"/utf8>>) -> {error, {parse_error, <<"get_next_int 2"/utf8>>}}; <<"6"/utf8, _/binary>> when not Allow_leading andalso (Cur =:= <<"0"/utf8>>) -> {error, {parse_error, <<"get_next_int 2"/utf8>>}}; <<"7"/utf8, _/binary>> when not Allow_leading andalso (Cur =:= <<"0"/utf8>>) -> {error, {parse_error, <<"get_next_int 2"/utf8>>}}; <<"8"/utf8, _/binary>> when not Allow_leading andalso (Cur =:= <<"0"/utf8>>) -> {error, {parse_error, <<"get_next_int 2"/utf8>>}}; <<"9"/utf8, _/binary>> when not Allow_leading andalso (Cur =:= <<"0"/utf8>>) -> {error, {parse_error, <<"get_next_int 2"/utf8>>}}; <> when N =:= <<"0"/utf8>> -> get_next_int_as_string( Rest@2, Allow_leading, <> ); <> when N =:= <<"1"/utf8>> -> get_next_int_as_string( Rest@2, Allow_leading, <> ); <> when N =:= <<"2"/utf8>> -> get_next_int_as_string( Rest@2, Allow_leading, <> ); <> when N =:= <<"3"/utf8>> -> get_next_int_as_string( Rest@2, Allow_leading, <> ); <> when N =:= <<"4"/utf8>> -> get_next_int_as_string( Rest@2, Allow_leading, <> ); <> when N =:= <<"5"/utf8>> -> get_next_int_as_string( Rest@2, Allow_leading, <> ); <> when N =:= <<"6"/utf8>> -> get_next_int_as_string( Rest@2, Allow_leading, <> ); <> when N =:= <<"7"/utf8>> -> get_next_int_as_string( Rest@2, Allow_leading, <> ); <> when N =:= <<"8"/utf8>> -> get_next_int_as_string( Rest@2, Allow_leading, <> ); <> when N =:= <<"9"/utf8>> -> get_next_int_as_string( Rest@2, Allow_leading, <> ); _ when Cur =:= <<""/utf8>> -> {error, no_match}; _ -> {ok, {Cur, Str}} end. -file("src/simplejson/internal/jsonpath.gleam", 1283). ?DOC(false). -spec trim_whitespace(binary()) -> binary(). trim_whitespace(Str) -> case Str of <<" "/utf8, Rest/binary>> -> trim_whitespace(Rest); <<"\t"/utf8, Rest/binary>> -> trim_whitespace(Rest); <<"\n"/utf8, Rest/binary>> -> trim_whitespace(Rest); <<"\r"/utf8, Rest/binary>> -> trim_whitespace(Rest); _ -> Str end. -file("src/simplejson/internal/jsonpath.gleam", 1369). ?DOC(false). -spec get_return_type(defined_function()) -> type(). get_return_type(F) -> case F of count -> value; length -> value; match -> logical; search -> logical; {unknown, _} -> value; value_of -> value end. -file("src/simplejson/internal/jsonpath.gleam", 662). ?DOC(false). -spec function_to_testexpression( fun((binary()) -> {ok, {function_(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}) ) -> fun((binary()) -> {ok, {test_expression(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}). function_to_testexpression(F) -> fun(Str) -> case F(Str) of {ok, {F@1, Rest}} -> case get_return_type(erlang:element(2, F@1)) of logical -> {ok, {{function_expr, F@1}, Rest}}; nodes -> {ok, {{function_expr, F@1}, Rest}}; value -> {error, function_error} end; {error, A} -> {error, A} end end. -file("src/simplejson/internal/jsonpath.gleam", 713). ?DOC(false). -spec get_arg_type(function_argument()) -> type(). get_arg_type(Arg) -> case Arg of {function_arg, {function, Deffn, _}} -> get_return_type(Deffn); {literal_arg, _} -> value; {logical_arg, _} -> logical; {query_arg, _} -> nodes; {query_singular_arg, _} -> value end. -file("src/simplejson/internal/jsonpath.gleam", 723). ?DOC(false). -spec validate_function(function_()) -> boolean(). validate_function(F) -> case F of {function, count, [Param]} -> case Param of {query_singular_arg, _} -> true; _ -> case get_arg_type(Param) of nodes -> true; _ -> false end end; {function, length, [Param@1]} -> case get_arg_type(Param@1) of value -> true; _ -> false end; {function, match, [Param1, Param2]} -> case {get_arg_type(Param1), get_arg_type(Param2)} of {value, value} -> true; {_, _} -> false end; {function, search, [Param1@1, Param2@1]} -> case {get_arg_type(Param1@1), get_arg_type(Param2@1)} of {value, value} -> true; {_, _} -> false end; {function, {unknown, _}, _} -> true; {function, value_of, [Param@2]} -> case get_arg_type(Param@2) of nodes -> true; value -> true; _ -> false end; _ -> false end. -file("src/simplejson/internal/jsonpath.gleam", 953). ?DOC(false). -spec get_comparable_return_type(comparable()) -> type(). get_comparable_return_type(Cmp) -> case Cmp of {function_expr_cmp, {function, Deffn, _}} -> get_return_type(Deffn); {literal, _} -> value; {query_cmp, _} -> value end. -file("src/simplejson/internal/jsonpath.gleam", 942). ?DOC(false). -spec validate_comparison(comparable(), comparable(), compare_op()) -> boolean(). validate_comparison(Cmp1, Cmp2, _) -> case {get_comparable_return_type(Cmp1), get_comparable_return_type(Cmp2)} of {logical, _} -> false; {_, logical} -> false; {_, _} -> true end. -file("src/simplejson/internal/jsonpath.gleam", 1266). ?DOC(false). -spec validate_int(binary()) -> {ok, integer()} | {error, simplejson@jsonvalue:json_path_error()}. validate_int(Str) -> case gleam_stdlib:parse_int(Str) of {ok, I} -> case I < -9007199254740991 of false -> case I > 9007199254740991 of false -> {ok, I}; true -> {error, {index_out_of_range, I}} end; true -> {error, {index_out_of_range, I}} end; {error, _} -> {error, {parse_error, <<"validate_int"/utf8>>}} end. -file("src/simplejson/internal/jsonpath.gleam", 1251). ?DOC(false). -spec get_next_int(binary(), boolean()) -> {ok, {integer(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. get_next_int(Str, Allow_leading) -> gleam@result:'try'( get_next_int_as_string(Str, Allow_leading, <<""/utf8>>), fun(_use0) -> {Next_int, Str@1} = _use0, case validate_int(Next_int) of {error, E} -> {error, E}; {ok, I} -> {ok, {I, Str@1}} end end ). -file("src/simplejson/internal/jsonpath.gleam", 200). ?DOC(false). -spec parse_index_selector(binary()) -> {ok, {selector(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_index_selector(Str) -> case get_next_int(Str, false) of {ok, {Val1, Rest}} -> {ok, {{index, Val1}, Rest}}; {error, _} -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 209). ?DOC(false). -spec parse_slice_selector(binary()) -> {ok, {selector(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_slice_selector(Str) -> gleam@result:'try'(case get_next_int(Str, false) of {error, _} -> Str@1 = trim_whitespace(Str), case Str@1 of <<":"/utf8, Rest/binary>> -> {ok, {none, Rest}}; _ -> {error, no_match} end; {ok, {I, Rest@1}} -> Rest@2 = trim_whitespace(Rest@1), case Rest@2 of <<":"/utf8, Rest@3/binary>> -> {ok, {{some, I}, Rest@3}}; _ -> {error, no_match} end end, fun(_use0) -> {Val1, Rest@4} = _use0, Rest@5 = trim_whitespace(Rest@4), gleam@result:'try'(case get_next_int(Rest@5, false) of {error, _} -> Rest@6 = trim_whitespace(Rest@5), case Rest@6 of <<":"/utf8, Rest@7/binary>> -> {ok, {none, Rest@7}}; Rest@8 -> {ok, {none, Rest@8}} end; {ok, {I@1, Rest@9}} -> Rest@10 = trim_whitespace(Rest@9), case Rest@10 of <<":"/utf8, Rest@11/binary>> -> {ok, {{some, I@1}, Rest@11}}; Rest@12 -> {ok, {{some, I@1}, Rest@12}} end end, fun(_use0@1) -> {Val2, Rest@13} = _use0@1, Rest@14 = trim_whitespace(Rest@13), Rest@15 = trim_whitespace(Rest@14), gleam@result:'try'(case get_next_int(Rest@15, false) of {error, _} -> {ok, {none, Rest@15}}; {ok, {I@2, Rest@16}} -> {ok, {{some, I@2}, Rest@16}} end, fun(_use0@2) -> {Val3, Rest@17} = _use0@2, {ok, {{slice, Val1, Val2, Val3}, Rest@17}} end) end) end). -file("src/simplejson/internal/jsonpath.gleam", 1060). ?DOC(false). -spec parse_index_segment(binary()) -> {ok, {singular_segment(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_index_segment(Str) -> case Str of <<"["/utf8, Rest/binary>> -> gleam@result:'try'( get_next_int(Rest, false), fun(_use0) -> {I, Rest@1} = _use0, case Rest@1 of <<"]"/utf8, Rest@2/binary>> -> {ok, {{single_index, I}, Rest@2}}; _ -> {error, no_match} end end ); _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 1048). ?DOC(false). -spec do_parse_singular_query_segments(binary()) -> {ok, {singular_segment(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_singular_query_segments(Str) -> Str@1 = trim_whitespace(Str), _pipe = [fun parse_name_selector_segment/1, fun parse_member_name_segment/1, fun parse_index_segment/1], try_options(_pipe, Str@1). -file("src/simplejson/internal/jsonpath.gleam", 1035). ?DOC(false). -spec do_parse_singular_query(binary(), list(singular_segment())) -> {ok, {list(singular_segment()), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_singular_query(Str, Cur) -> case do_parse_singular_query_segments(Str) of {ok, {Seg, Rest}} -> do_parse_singular_query(Rest, [Seg | Cur]); {error, _} when Cur =:= [] -> {ok, {[], Str}}; {error, _} -> {ok, {lists:reverse(Cur), Str}} end. -file("src/simplejson/internal/jsonpath.gleam", 1019). ?DOC(false). -spec parse_singular_query(binary()) -> {ok, {singular_query(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_singular_query(Str) -> case Str of <<"@"/utf8, Rest/binary>> -> gleam@result:'try'( do_parse_singular_query(Rest, []), fun(_use0) -> {Segs, Rest@1} = _use0, {ok, {{rel_query, Segs}, Rest@1}} end ); <<"$"/utf8, Rest@2/binary>> -> gleam@result:'try'( do_parse_singular_query(Rest@2, []), fun(_use0@1) -> {Segs@1, Rest@3} = _use0@1, {ok, {{abs_query, Segs@1}, Rest@3}} end ); _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 1128). ?DOC(false). -spec parse_literal_number(binary()) -> {ok, {literal(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_literal_number(Str) -> gleam@result:'try'(case Str of <<"-0"/utf8, Rest/binary>> -> {ok, {true, 0, Rest}}; Rest@1 -> gleam@result:'try'( get_next_int(Rest@1, false), fun(_use0) -> {I, Rest@2} = _use0, {ok, {I < 0, gleam@int:absolute_value(I), Rest@2}} end ) end, fun(_use0@1) -> {Neg, Int, Rest@3} = _use0@1, gleam@result:'try'(case Rest@3 of <<".-"/utf8, _/binary>> -> {error, no_match}; <<"."/utf8, Rest@4/binary>> -> case get_next_int_as_string(Rest@4, true, <<""/utf8>>) of {error, _} -> {error, no_match}; {ok, {I@1, Rest@5}} -> {ok, {{some, I@1}, Rest@5}} end; _ -> {ok, {none, Rest@3}} end, fun(_use0@2) -> {Frac, Rest@6} = _use0@2, gleam@result:'try'(case Rest@6 of <<"E+-"/utf8, _/binary>> -> {error, {parse_error, <<"parse_literal_number"/utf8>>}}; <<"e+-"/utf8, _/binary>> -> {error, {parse_error, <<"parse_literal_number"/utf8>>}}; <<"E+"/utf8, Rest@7/binary>> -> case get_next_int(Rest@7, true) of {error, _} -> {error, no_match}; {ok, {I@2, Rest@8}} -> {ok, {{some, I@2}, Rest@8}} end; <<"e+"/utf8, Rest@7/binary>> -> case get_next_int(Rest@7, true) of {error, _} -> {error, no_match}; {ok, {I@2, Rest@8}} -> {ok, {{some, I@2}, Rest@8}} end; <<"E"/utf8, Rest@7/binary>> -> case get_next_int(Rest@7, true) of {error, _} -> {error, no_match}; {ok, {I@2, Rest@8}} -> {ok, {{some, I@2}, Rest@8}} end; <<"e"/utf8, Rest@7/binary>> -> case get_next_int(Rest@7, true) of {error, _} -> {error, no_match}; {ok, {I@2, Rest@8}} -> {ok, {{some, I@2}, Rest@8}} end; _ -> {ok, {none, Rest@6}} end, fun(_use0@3) -> {Exp, Rest@9} = _use0@3, Num = <<<<<<((case Neg of true -> <<"-"/utf8>>; false -> <<""/utf8>> end))/binary, (erlang:integer_to_binary( Int ))/binary>>/binary, ((case Frac of {some, F} -> <<"."/utf8, F/binary>>; none -> <<""/utf8>> end))/binary>>/binary, ((case Exp of {some, E} -> <<"e"/utf8, (erlang:integer_to_binary(E))/binary>>; none -> <<""/utf8>> end))/binary>>, gleam@result:'try'( begin _pipe = bigdecimal:from_string(Num), gleam@result:replace_error( _pipe, {parse_error, <<"parse_literal_number"/utf8>>} ) end, fun(Num@1) -> {ok, {{number, Num@1}, Rest@9}} end ) end) end) end). -file("src/simplejson/internal/jsonpath.gleam", 1113). ?DOC(false). -spec do_parse_literal(binary()) -> {ok, {literal(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_literal(Str) -> case Str of <<"true"/utf8, Rest/binary>> -> {ok, {{boolean, true}, Rest}}; <<"false"/utf8, Rest@1/binary>> -> {ok, {{boolean, false}, Rest@1}}; <<"null"/utf8, Rest@2/binary>> -> {ok, {null, Rest@2}}; _ -> _pipe = [fun parse_literal_number/1, string_to_literal(fun parse_string_literal/1)], try_options(_pipe, Str) end. -file("src/simplejson/internal/jsonpath.gleam", 645). ?DOC(false). -spec do_parse_filter_query(binary()) -> {ok, {filter(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_filter_query(Str) -> case Str of <<"$"/utf8, Rest/binary>> -> gleam@result:'try'( do_parse_segments(Rest, []), fun(_use0) -> {Path, Rest@1} = _use0, {ok, {{root, Path}, Rest@1}} end ); <<"@"/utf8, Rest@2/binary>> -> gleam@result:'try'( do_parse_segments(Rest@2, []), fun(_use0@1) -> {Path@1, Rest@3} = _use0@1, {ok, {{relative, Path@1}, Rest@3}} end ); _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 59). ?DOC(false). -spec do_parse_segments(binary(), list(segment())) -> {ok, {list(segment()), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_segments(Str, Segments) -> Rest = trim_whitespace(Str), case do_parse_segment(Rest) of {error, no_match} when Segments =:= [] -> {ok, {[], Str}}; {error, no_match} -> {ok, {lists:reverse(Segments), Rest}}; {ok, {Segment, Rest@1}} -> do_parse_segments(Rest@1, [Segment | Segments]); {error, E} -> {error, E} end. -file("src/simplejson/internal/jsonpath.gleam", 74). ?DOC(false). -spec do_parse_segment(binary()) -> {ok, {segment(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_segment(Str) -> case Str of <<".."/utf8, Rest/binary>> -> do_parse_descendent_segment(Rest); <<"."/utf8, _/binary>> -> do_parse_child_segment(Str); <<"["/utf8, _/binary>> -> do_parse_child_segment(Str); _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 142). ?DOC(false). -spec do_parse_descendent_segment(binary()) -> {ok, {segment(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_descendent_segment(Str) -> _pipe = [selector_to_selectors(fun parse_wildcard_selector/1), selector_to_selectors(member_name_to_selector(fun parse_member_name/1)), fun parse_bracketed_selection/1], _pipe@1 = try_options(_pipe, Str), selector_to_segment(_pipe@1, fun(Field@0) -> {descendant, Field@0} end). -file("src/simplejson/internal/jsonpath.gleam", 154). ?DOC(false). -spec parse_bracketed_selection(binary()) -> {ok, {list(selector()), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_bracketed_selection(Str) -> do_parse_bracketed_selection(Str, []). -file("src/simplejson/internal/jsonpath.gleam", 160). ?DOC(false). -spec do_parse_bracketed_selection(binary(), list(selector())) -> {ok, {list(selector()), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_bracketed_selection(Str, Selectors) -> case Str of <<"["/utf8, _/binary>> when Selectors =/= [] -> {error, {parse_error, <<"do_parse_bracketed_selection 1"/utf8>>}}; <<","/utf8, _/binary>> when Selectors =:= [] -> {error, {parse_error, <<"do_parse_bracketed_selection 2"/utf8>>}}; <<"["/utf8, Rest/binary>> -> Rest@1 = trim_whitespace(Rest), gleam@result:'try'( do_parse_selector(Rest@1), fun(_use0) -> {Sel, Rest@2} = _use0, do_parse_bracketed_selection( trim_whitespace(Rest@2), [Sel | Selectors] ) end ); <<","/utf8, Rest/binary>> -> Rest@1 = trim_whitespace(Rest), gleam@result:'try'( do_parse_selector(Rest@1), fun(_use0) -> {Sel, Rest@2} = _use0, do_parse_bracketed_selection( trim_whitespace(Rest@2), [Sel | Selectors] ) end ); <<"]"/utf8, Rest@3/binary>> -> {ok, {lists:reverse(Selectors), Rest@3}}; _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 189). ?DOC(false). -spec do_parse_selector(binary()) -> {ok, {selector(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_selector(Str) -> _pipe = [fun parse_wildcard_selector/1, member_name_to_selector(fun parse_string_literal/1), fun parse_slice_selector/1, fun parse_index_selector/1, fun parse_filter_selector/1], try_options(_pipe, Str). -file("src/simplejson/internal/jsonpath.gleam", 529). ?DOC(false). -spec parse_filter_selector(binary()) -> {ok, {selector(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. parse_filter_selector(Str) -> case Str of <<"?"/utf8, Rest/binary>> -> Rest@1 = trim_whitespace(Rest), gleam@result:'try'( do_parse_logical_expr(Rest@1), fun(_use0) -> {Le, Rest@2} = _use0, {ok, {{filter, Le}, Rest@2}} end ); _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 542). ?DOC(false). -spec do_parse_logical_expr(binary()) -> {ok, {logical_expression(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_logical_expr(Str) -> Str@1 = trim_whitespace(Str), case do_parse_logical_or_expr(Str@1, {logical_or_expression, []}) of {ok, {{logical_or_expression, Lo}, Rest}} -> {ok, {{logical_expression, {logical_or_expression, lists:reverse(Lo)}}, Rest}}; _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 553). ?DOC(false). -spec do_parse_logical_or_expr(binary(), logical_or_expression()) -> {ok, {logical_or_expression(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_logical_or_expr(Str, Cur) -> Str@1 = trim_whitespace(Str), case {Str@1, Cur} of {<<"||"/utf8, Rest/binary>>, {logical_or_expression, Cur_list}} -> case do_parse_logical_and_expr(Rest, {logical_and_expression, []}) of {ok, {{logical_and_expression, Lae}, Rest@1}} -> do_parse_logical_or_expr( Rest@1, {logical_or_expression, [{logical_and_expression, lists:reverse(Lae)} | Cur_list]} ); {error, _} when Cur =:= {logical_or_expression, []} -> {error, no_match}; {error, _} -> {ok, {Cur, Str@1}} end; {Rest, {logical_or_expression, Cur_list}} -> case do_parse_logical_and_expr(Rest, {logical_and_expression, []}) of {ok, {{logical_and_expression, Lae}, Rest@1}} -> do_parse_logical_or_expr( Rest@1, {logical_or_expression, [{logical_and_expression, lists:reverse(Lae)} | Cur_list]} ); {error, _} when Cur =:= {logical_or_expression, []} -> {error, no_match}; {error, _} -> {ok, {Cur, Str@1}} end end. -file("src/simplejson/internal/jsonpath.gleam", 578). ?DOC(false). -spec do_parse_logical_and_expr(binary(), logical_and_expression()) -> {ok, {logical_and_expression(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_logical_and_expr(Str, Cur) -> Str@1 = trim_whitespace(Str), case {Str@1, Cur} of {<<"&&"/utf8, Rest/binary>>, {logical_and_expression, Cur_list}} -> case do_parse_basic_expr(Rest) of {ok, {Expr, Rest@1}} -> do_parse_logical_and_expr( Rest@1, {logical_and_expression, [Expr | Cur_list]} ); {error, _} when Cur =:= {logical_and_expression, []} -> {error, no_match}; {error, _} -> {ok, {Cur, Str@1}} end; {Rest, {logical_and_expression, Cur_list}} -> case do_parse_basic_expr(Rest) of {ok, {Expr, Rest@1}} -> do_parse_logical_and_expr( Rest@1, {logical_and_expression, [Expr | Cur_list]} ); {error, _} when Cur =:= {logical_and_expression, []} -> {error, no_match}; {error, _} -> {ok, {Cur, Str@1}} end end. -file("src/simplejson/internal/jsonpath.gleam", 600). ?DOC(false). -spec do_parse_basic_expr(binary()) -> {ok, {expression(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_basic_expr(Str) -> Str@1 = trim_whitespace(Str), _pipe = [fun do_parse_paren_expr/1, fun do_parse_comparison_expr/1, fun do_parse_test_expr/1], try_options(_pipe, Str@1). -file("src/simplejson/internal/jsonpath.gleam", 612). ?DOC(false). -spec do_parse_test_expr(binary()) -> {ok, {expression(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_test_expr(Str) -> {Not, Str@1} = case Str of <<"!"/utf8, Rest/binary>> -> {true, Rest}; _ -> {false, Str} end, Str@2 = trim_whitespace(Str@1), _pipe = [filter_to_testexpression(fun do_parse_filter_query/1), function_to_testexpression(fun do_parse_function_expr/1)], gleam@list:fold_until( _pipe, {error, no_match}, fun(_, Parsefn) -> case Parsefn(Str@2) of {error, no_match} -> {continue, {error, no_match}}; {error, E} -> {stop, {error, E}}; {ok, {Expr, Str@3}} -> {stop, {ok, {{test, Expr, Not}, Str@3}}} end end ). -file("src/simplejson/internal/jsonpath.gleam", 46). ?DOC(false). -spec parse_path(binary()) -> {ok, list(segment())} | {error, simplejson@jsonvalue:json_path_error()}. parse_path(Str) -> case Str of <<"$"/utf8, Rest/binary>> -> gleam@result:'try'( do_parse_segments(Rest, []), fun(_use0) -> {Path, Rest@1} = _use0, case Rest@1 of <<""/utf8>> -> {ok, Path}; _ -> {error, {parse_error, <<"parse_path"/utf8>>}} end end ); _ -> {error, missing_root} end. -file("src/simplejson/internal/jsonpath.gleam", 113). ?DOC(false). -spec do_parse_child_segment(binary()) -> {ok, {segment(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_child_segment(Str) -> case Str of <<"."/utf8, Rest/binary>> -> _pipe = [selector_to_selectors(fun parse_wildcard_selector/1), selector_to_selectors( member_name_to_selector(fun parse_member_name/1) )], _pipe@1 = try_options(_pipe, Rest), selector_to_segment(_pipe@1, fun(Field@0) -> {child, Field@0} end); <<"["/utf8, _/binary>> -> gleam@result:'try'( parse_bracketed_selection(Str), fun(_use0) -> {Sels, Rest@1} = _use0, {ok, {{child, Sels}, Rest@1}} end ); _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 1190). ?DOC(false). -spec do_parse_paren_expr(binary()) -> {ok, {expression(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_paren_expr(Str) -> {Not, Str@1} = case Str of <<"!"/utf8, Rest/binary>> -> {true, Rest}; _ -> {false, Str} end, Str@2 = trim_whitespace(Str@1), case Str@2 of <<"("/utf8, Rest@1/binary>> -> gleam@result:'try'( do_parse_logical_expr(Rest@1), fun(_use0) -> {Le, Rest@2} = _use0, Rest@3 = trim_whitespace(Rest@2), case Rest@3 of <<")"/utf8, Rest@4/binary>> -> {ok, {{paren, Le, Not}, Rest@4}}; _ -> {error, no_match} end end ); _ -> {error, no_match} end. -file("src/simplejson/internal/jsonpath.gleam", 785). ?DOC(false). -spec do_parse_function_arg(binary()) -> {ok, {function_argument(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_function_arg(Str) -> _pipe = [literal_to_arg(fun do_parse_literal/1), filter_to_arg(fun do_parse_filter_query/1), logical_to_arg(fun do_parse_logical_expr/1), function_to_arg(fun do_parse_function_expr/1)], try_options(_pipe, Str). -file("src/simplejson/internal/jsonpath.gleam", 678). ?DOC(false). -spec do_parse_function_expr(binary()) -> {ok, {function_(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_function_expr(Str) -> gleam@result:'try'( do_parse_function_name(Str, <<""/utf8>>), fun(_use0) -> {Name, Rest} = _use0, case Rest of <<"("/utf8, Rest@1/binary>> -> gleam@result:'try'( do_parse_function_args(Rest@1, []), fun(_use0@1) -> {Args, Rest@2} = _use0@1, Rest@3 = trim_whitespace(Rest@2), case Rest@3 of <<")"/utf8, Rest@4/binary>> -> Deffn = name_to_function(Name), case validate_function( {function, Deffn, Args} ) of true -> {ok, {{function, Deffn, Args}, Rest@4}}; false -> {error, function_error} end; _ -> {error, no_match} end end ); _ -> {error, no_match} end end ). -file("src/simplejson/internal/jsonpath.gleam", 768). ?DOC(false). -spec do_parse_function_args(binary(), list(function_argument())) -> {ok, {list(function_argument()), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_function_args(Str, Args) -> Rest = trim_whitespace(Str), case Rest of <<","/utf8, Rest@1/binary>> -> do_parse_function_args(Rest@1, Args); Rest@2 -> case do_parse_function_arg(Rest@2) of {ok, {Arg, Rest@3}} -> do_parse_function_args(Rest@3, [Arg | Args]); {error, _} when Args =:= [] -> {error, no_match}; {error, _} -> {ok, {lists:reverse(Args), Rest@2}} end end. -file("src/simplejson/internal/jsonpath.gleam", 986). ?DOC(false). -spec do_parse_comparable(binary()) -> {ok, {comparable(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_comparable(Str) -> _pipe = [literal_to_comparable(fun do_parse_literal/1), singular_to_comparable(fun parse_singular_query/1), function_to_comparable(fun do_parse_function_expr/1)], try_options(_pipe, Str). -file("src/simplejson/internal/jsonpath.gleam", 928). ?DOC(false). -spec do_parse_comparison_expr(binary()) -> {ok, {expression(), binary()}} | {error, simplejson@jsonvalue:json_path_error()}. do_parse_comparison_expr(Str) -> gleam@result:'try'( do_parse_comparable(Str), fun(_use0) -> {Cmp1, Rest} = _use0, Rest@1 = trim_whitespace(Rest), gleam@result:'try'( do_parse_comparisonop(Rest@1), fun(_use0@1) -> {Cmpop, Rest@2} = _use0@1, Rest@3 = trim_whitespace(Rest@2), gleam@result:'try'( do_parse_comparable(Rest@3), fun(_use0@2) -> {Cmp2, Rest@4} = _use0@2, case validate_comparison(Cmp1, Cmp2, Cmpop) of true -> {ok, {{comparison, Cmp1, Cmp2, Cmpop}, Rest@4}}; false -> {error, comparison_error} end end ) end ) end ).