-module(internal@encoder@percent_encoding). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/internal/encoder/percent_encoding.gleam"). -export([estimate_encoded_size/2, encode_string/3]). -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( " Percent Encodes strings according to RFC 3986.\n" "\n" " See the following links for reference:\n" " - \n" ). -file("src/internal/encoder/percent_encoding.gleam", 82). -spec should_encode_character(binary()) -> boolean(). should_encode_character(Character) -> ((((gleam@string:compare(Character, <<"0"/utf8>>) =:= lt) orelse (gleam@string:compare( Character, <<"9"/utf8>> ) =:= gt)) andalso ((gleam@string:compare(Character, <<"A"/utf8>>) =:= lt) orelse (gleam@string:compare( Character, <<"Z"/utf8>> ) =:= gt))) andalso ((gleam@string:compare(Character, <<"a"/utf8>>) =:= lt) orelse (gleam@string:compare( Character, <<"z"/utf8>> ) =:= gt))) andalso not gleam_stdlib:contains_string(<<"-_.~"/utf8>>, Character). -file("src/internal/encoder/percent_encoding.gleam", 18). ?DOC( " Estimates the percent encoded size of a string in bytes, taking\n" " maximum size of a line into account.\n" ). -spec estimate_encoded_size(binary(), integer()) -> {ok, integer()} | {error, internal@encoder@encoding:encoder_error()}. estimate_encoded_size(String, Maximum_size) -> _pipe = String, _pipe@1 = gleam@string:split(_pipe, <<""/utf8>>), gleam@list:try_fold( _pipe@1, 0, fun(Size, Character) -> Character_size = erlang:byte_size(Character), _pipe@2 = case should_encode_character(Character) of true -> {ok, Size + (3 * Character_size)}; false -> {ok, Size + Character_size} end, gleam@result:'try'( _pipe@2, fun(Size@1) -> case Size@1 =< Maximum_size of true -> {ok, Size@1}; false -> {error, {maximum_size_exceeded, Maximum_size}} end end ) end ). -file("src/internal/encoder/percent_encoding.gleam", 106). -spec do_encode_bytes(bitstring(), list(binary())) -> binary(). do_encode_bytes(Bytes, Acc) -> case Bytes of <> -> do_encode_bytes( Rest, [<<"%"/utf8, (gleam_stdlib:base16_encode(Byte))/binary>> | Acc] ); <<_/bitstring>> -> _pipe = Acc, _pipe@1 = lists:reverse(_pipe), gleam@string:join(_pipe@1, <<""/utf8>>) end. -file("src/internal/encoder/percent_encoding.gleam", 98). -spec encode_character(binary()) -> binary(). encode_character(Character) -> gleam@bool:guard( not should_encode_character(Character), Character, fun() -> do_encode_bytes(gleam_stdlib:identity(Character), []) end ). -file("src/internal/encoder/percent_encoding.gleam", 53). -spec do_encode_string(list(binary()), integer(), integer()) -> {ok, list(binary())} | {error, internal@encoder@encoding:encoder_error()}. do_encode_string(Characters, Count, Maximum_size) -> _pipe = Characters, _pipe@1 = gleam@list:try_fold( _pipe, {Count, []}, fun(Accumulator, Character) -> {Used_size, Lines} = Accumulator, Encoded_character = encode_character(Character), Encoded_character_size = erlang:byte_size(Encoded_character), case Lines of [] -> {ok, {Encoded_character_size, [Encoded_character]}}; [First_line | Other_lines] when (Used_size + Encoded_character_size) =< Maximum_size -> {ok, {Used_size + Encoded_character_size, [<> | Other_lines]}}; _ -> {error, {maximum_size_exceeded, Maximum_size}} end end ), gleam@result:map(_pipe@1, fun gleam@pair:second/1). -file("src/internal/encoder/percent_encoding.gleam", 43). ?DOC( " Percent encode a string, taking the maximum line size into\n" " account and pretending to start the first line at the passed\n" " start position.\n" ). -spec encode_string(binary(), integer(), integer()) -> {ok, list(binary())} | {error, internal@encoder@encoding:encoder_error()}. encode_string(String, Position, Maximum_size) -> _pipe = String, _pipe@1 = gleam@string:split(_pipe, <<""/utf8>>), do_encode_string(_pipe@1, Position, Maximum_size).