Current section

Files

Jump to
scrapbook src scrapbook@internal@html.erl
Raw

src/scrapbook@internal@html.erl

-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 => <<?FILEPATH/utf8>>,
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.