-module(scrapbook@internal@html). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/scrapbook/internal/html.gleam"). -export([get_property/4, no_value_to_option/1, no_prefix_to_option/1]). -export_type([find_key_value_result/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 find_key_value_result() :: {find_key_value_result, binary(), binary()}. -file("src/scrapbook/internal/html.gleam", 13). ?DOC(false). -spec do_find_value_end_index( binary(), integer(), binary(), integer(), boolean() ) -> {ok, integer()} | {error, scrapbook@error:index_search_error()}. do_find_value_end_index( Html, Index, Previous_character, Nested_level, Inside_string ) -> case Html of <<""/utf8>> -> {error, {no_index_found, Index}}; <<"\""/utf8, Rest/binary>> when Previous_character =/= <<"\\"/utf8>> -> do_find_value_end_index( Rest, Index + 1, <<"\""/utf8>>, Nested_level, not Inside_string ); <<"}"/utf8, Rest@1/binary>> when Inside_string =:= false -> case Nested_level =:= 1 of true -> {ok, Index}; false -> do_find_value_end_index( Rest@1, Index + 1, <<"}"/utf8>>, Nested_level - 1, Inside_string ) end; <<"]"/utf8, Rest@2/binary>> when Inside_string =:= false -> case Nested_level =:= 1 of true -> {ok, Index}; false -> do_find_value_end_index( Rest@2, Index + 1, <<"]"/utf8>>, Nested_level - 1, Inside_string ) end; <<"{"/utf8, Rest@3/binary>> when Inside_string =:= false -> do_find_value_end_index( Rest@3, Index + 1, <<"{"/utf8>>, Nested_level + 1, Inside_string ); <<"["/utf8, Rest@4/binary>> when Inside_string =:= false -> do_find_value_end_index( Rest@4, Index + 1, <<"["/utf8>>, Nested_level + 1, Inside_string ); _ -> {First@1, Rest@6} = case gleam_stdlib:string_pop_grapheme(Html) of {ok, {First, Rest@5}} -> {First, Rest@5}; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"scrapbook/internal/html"/utf8>>, function => <<"do_find_value_end_index"/utf8>>, line => 73, value => _assert_fail, start => 1788, 'end' => 1845, pattern_start => 1799, pattern_end => 1817}) end, do_find_value_end_index( Rest@6, Index + 1, First@1, Nested_level, Inside_string ) end. -file("src/scrapbook/internal/html.gleam", 85). ?DOC(false). -spec find_value_end_index(binary()) -> {ok, integer()} | {error, scrapbook@error:index_search_error()}. find_value_end_index(Html) -> do_find_value_end_index(Html, 0, <<""/utf8>>, 0, false). -file("src/scrapbook/internal/html.gleam", 95). ?DOC(false). -spec find_value(binary()) -> {ok, binary()} | {error, scrapbook@error:find_value_error()}. find_value(Html) -> gleam@bool:guard( begin _pipe = Html, gleam_stdlib:string_starts_with(_pipe, <<"null"/utf8>>) end, {error, no_value}, fun() -> gleam@result:'try'(case Html of <<""/utf8>> -> {error, no_graphemes}; <<"{"/utf8, _/binary>> -> {ok, nil}; <<"["/utf8, _/binary>> -> {ok, nil}; _ -> {error, invalid_start_character} end, fun(_) -> gleam@result:'try'(case find_value_end_index(Html) of {ok, Value} -> {ok, Value}; {error, Err} -> {error, {no_value_end_found, Err}} end, fun(End_index) -> {ok, begin _pipe@1 = Html, gleam@string:slice( _pipe@1, 0, End_index + 1 ) end} end) end) end ). -file("src/scrapbook/internal/html.gleam", 116). ?DOC(false). -spec find_key_value(binary(), binary()) -> {ok, find_key_value_result()} | {error, scrapbook@error:find_key_value_error()}. find_key_value(Html, Key) -> Prefix = <<<<"\""/utf8, Key/binary>>/binary, "\":"/utf8>>, gleam@result:'try'( gleam@result:replace_error( begin _pipe = Html, gleam@string:split_once(_pipe, Prefix) end, {no_prefix, Key} ), fun(_use0) -> {_, Html@1} = _use0, case find_value(Html@1) of {ok, Value} -> {ok, {find_key_value_result, Html@1, Value}}; {error, Err} -> {error, {find_value_error, Err}} end end ). -file("src/scrapbook/internal/html.gleam", 134). ?DOC(false). -spec do_get_property( binary(), binary(), gleam@dynamic@decode:decoder(MLV), fun((MLV) -> boolean()), list(scrapbook@error:property_error()) ) -> {ok, MLV} | {error, list(scrapbook@error:property_error())}. do_get_property(Html, Key, Decoder, Validator, Errors) -> gleam@result:'try'(case find_key_value(Html, Key) of {ok, Value} -> {ok, Value}; {error, Err} -> case Errors of [] -> {error, [{find_key_value_error, Err}]}; _ -> {error, Errors} end end, fun(_use0) -> {find_key_value_result, Html@1, Json_string} = _use0, case gleam@json:parse(Json_string, Decoder) of {ok, Value@1} -> case Validator(Value@1) of true -> {ok, Value@1}; false -> do_get_property( Html@1, Key, Decoder, Validator, [validate_error | Errors] ) end; {error, Err@1} -> do_get_property( Html@1, Key, Decoder, Validator, [{decode_error, Err@1} | Errors] ) end end). -file("src/scrapbook/internal/html.gleam", 171). ?DOC(false). -spec get_property( binary(), binary(), gleam@dynamic@decode:decoder(MMB), fun((MMB) -> boolean()) ) -> {ok, MMB} | {error, list(scrapbook@error:property_error())}. get_property(Html, Key, Decoder, Validator) -> do_get_property(Html, Key, Decoder, Validator, []). -file("src/scrapbook/internal/html.gleam", 182). ?DOC(false). -spec no_value_to_option( {ok, MMG} | {error, list(scrapbook@error:property_error())} ) -> {ok, gleam@option:option(MMG)} | {error, list(scrapbook@error:property_error())}. no_value_to_option(Result) -> case Result of {ok, Value} -> {ok, {some, Value}}; {error, [{find_key_value_error, {find_value_error, no_value}}]} -> {ok, none}; {error, Err} -> {error, Err} end. -file("src/scrapbook/internal/html.gleam", 195). ?DOC(false). -spec no_prefix_to_option( {ok, MMO} | {error, list(scrapbook@error:property_error())} ) -> {ok, gleam@option:option(MMO)} | {error, list(scrapbook@error:property_error())}. no_prefix_to_option(Result) -> case Result of {ok, Value} -> {ok, {some, Value}}; {error, [{find_key_value_error, {no_prefix, _}}]} -> {ok, none}; {error, Err} -> {error, Err} end.