Packages

Parse and encode URL query strings

Current section

Files

Jump to
qs src qs.erl
Raw

src/qs.erl

-module(qs).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([default_config/0, with_fail_on_invalid/2, parse_key_value/1, split_and_parse/2, add_question_mark/1, decode/1, encode/1, default_serialize/1, empty/0, parse/2, default_parse/1, get/2, has_key/2, insert/3, merge/2, delete/2]).
-export_type([config/0]).
-type config() :: {config, boolean()}.
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 21).
-spec default_config() -> config().
default_config() ->
{config, false}.
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 25).
-spec with_fail_on_invalid(config(), boolean()) -> config().
with_fail_on_invalid(_, Value) ->
{config, Value}.
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 34).
-spec parse_key_value(binary()) -> {ok, {binary(), binary()}} |
{error, binary()}.
parse_key_value(Segment) ->
Decoded = begin
_pipe = Segment,
_pipe@1 = gleam@uri:percent_decode(_pipe),
gleam@result:unwrap(_pipe@1, Segment)
end,
Split_result = gleam@string:split_once(Decoded, <<"="/utf8>>),
Unabled_to_parse = <<"Unable to parse "/utf8, Segment/binary>>,
case Split_result of
{ok, {Key, Value}} ->
case Value of
<<""/utf8>> ->
{error, Unabled_to_parse};
_ ->
{ok, {Key, Value}}
end;
{error, _} ->
{error, Unabled_to_parse}
end.
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 84).
-spec split_and_parse(binary(), boolean()) -> {ok, list({binary(), binary()})} |
{error, binary()}.
split_and_parse(Query, Fail_on_invalid) ->
Results = begin
_pipe = Query,
_pipe@1 = gleam@string:replace(_pipe, <<"?"/utf8>>, <<""/utf8>>),
_pipe@2 = gleam@string:split(_pipe@1, <<"&"/utf8>>),
gleam@list:map(_pipe@2, fun parse_key_value/1)
end,
case Fail_on_invalid of
true ->
_pipe@3 = Results,
gleam@result:all(_pipe@3);
false ->
_pipe@4 = Results,
_pipe@5 = gleam@result:values(_pipe@4),
{ok, _pipe@5}
end.
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 100).
-spec add_key_value(
gleam@dict:dict(binary(), list(binary())),
{binary(), binary()}
) -> gleam@dict:dict(binary(), list(binary())).
add_key_value(Query, Key_value) ->
{Key, Value} = Key_value,
Updater = fun(Res) -> case Res of
{some, Existing} ->
lists:append(Existing, [Value]);
none ->
[Value]
end end,
gleam@dict:upsert(Query, Key, Updater).
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 139).
-spec add_question_mark(binary()) -> binary().
add_question_mark(Query) ->
case Query of
<<""/utf8>> ->
<<""/utf8>>;
_ ->
<<"?"/utf8, Query/binary>>
end.
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 147).
-spec decode(binary()) -> {ok, binary()} | {error, nil}.
decode(Val) ->
gleam@uri:percent_decode(Val).
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 152).
-spec encode(binary()) -> binary().
encode(Val) ->
gleam@uri:percent_encode(Val).
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 133).
-spec serialize_key_value({binary(), list(binary())}) -> list(binary()).
serialize_key_value(Key_value) ->
{Key, Values} = Key_value,
gleam@list:map(
Values,
fun(Value) ->
<<<<(encode(Key))/binary, "="/utf8>>/binary,
(encode(Value))/binary>>
end
).
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 125).
-spec default_serialize(gleam@dict:dict(binary(), list(binary()))) -> binary().
default_serialize(Query) ->
_pipe = Query,
_pipe@1 = maps:to_list(_pipe),
_pipe@2 = gleam@list:flat_map(_pipe@1, fun serialize_key_value/1),
_pipe@3 = gleam@string:join(_pipe@2, <<"&"/utf8>>),
add_question_mark(_pipe@3).
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 157).
-spec empty() -> gleam@dict:dict(binary(), any()).
empty() ->
gleam@dict:new().
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 76).
-spec parse(binary(), config()) -> {ok,
gleam@dict:dict(binary(), list(binary()))} |
{error, binary()}.
parse(Input, Config) ->
gleam@result:then(
split_and_parse(Input, erlang:element(2, Config)),
fun(Key_values) ->
_pipe = gleam@list:fold(Key_values, empty(), fun add_key_value/2),
{ok, _pipe}
end
).
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 72).
-spec default_parse(binary()) -> {ok, gleam@dict:dict(binary(), list(binary()))} |
{error, binary()}.
default_parse(Qs) ->
parse(Qs, default_config()).
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 162).
-spec get(gleam@dict:dict(binary(), FXP), binary()) -> {ok, FXP} |
{error, binary()}.
get(Query, Key) ->
Error = <<"Invalid key "/utf8, Key/binary>>,
_pipe = gleam@dict:get(Query, Key),
gleam@result:replace_error(_pipe, Error).
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 170).
-spec has_key(gleam@dict:dict(binary(), any()), binary()) -> boolean().
has_key(Query, Key) ->
gleam@dict:has_key(Query, Key).
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 176).
-spec insert(gleam@dict:dict(binary(), FXV), binary(), FXV) -> gleam@dict:dict(binary(), FXV).
insert(Query, Key, Value) ->
gleam@dict:insert(Query, Key, Value).
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 182).
-spec merge(gleam@dict:dict(binary(), FXY), gleam@dict:dict(binary(), FXY)) -> gleam@dict:dict(binary(), FXY).
merge(A, B) ->
gleam@dict:merge(A, B).
-file("/Users/sebastian/Source/sporto/gleam-qs/src/qs.gleam", 187).
-spec delete(gleam@dict:dict(binary(), FYC), binary()) -> gleam@dict:dict(binary(), FYC).
delete(Query, Key) ->
gleam@dict:delete(Query, Key).