Current section
Files
Jump to
Current section
Files
src/clad@internal@args.erl
-module(clad@internal@args).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([split_equals/1, do_add_bools/2, add_bools/1]).
-spec is_alpha(binary()) -> boolean().
is_alpha(Character) ->
case Character of
<<"0"/utf8>> ->
false;
<<"1"/utf8>> ->
false;
<<"2"/utf8>> ->
false;
<<"3"/utf8>> ->
false;
<<"4"/utf8>> ->
false;
<<"5"/utf8>> ->
false;
<<"6"/utf8>> ->
false;
<<"7"/utf8>> ->
false;
<<"8"/utf8>> ->
false;
<<"9"/utf8>> ->
false;
_ ->
true
end.
-spec is_name(binary()) -> boolean().
is_name(Input) ->
case gleam@string:to_graphemes(Input) of
[<<"-"/utf8>>, <<"-"/utf8>>, Next | _] ->
is_alpha(Next);
[<<"-"/utf8>>, Next@1 | _] ->
is_alpha(Next@1);
_ ->
false
end.
-spec split_equals(list(binary())) -> list(binary()).
split_equals(Arguments) ->
gleam@list:flat_map(
Arguments,
fun(Arg) ->
gleam@bool:guard(
not is_name(Arg),
[Arg],
fun() -> case gleam@string:split_once(Arg, <<"="/utf8>>) of
{ok, {Arg@1, Value}} ->
[Arg@1, Value];
{error, _} ->
[Arg]
end end
)
end
).
-spec one_arg(binary()) -> list(binary()).
one_arg(Arg) ->
case is_name(Arg) of
true ->
[Arg, <<"true"/utf8>>];
false ->
[Arg]
end.
-spec do_add_bools(list(binary()), list(binary())) -> list(binary()).
do_add_bools(Arguments, Acc) ->
case Arguments of
[] ->
Acc;
[Arg] ->
lists:append(Acc, one_arg(Arg));
[First, Second | Rest] ->
case {is_name(First), is_name(Second)} of
{true, true} ->
do_add_bools(
[Second | Rest],
lists:append(Acc, [First, <<"true"/utf8>>])
);
{true, false} ->
do_add_bools(Rest, lists:append(Acc, [First, Second]));
{_, _} ->
do_add_bools([Second | Rest], Acc)
end
end.
-spec add_bools(list(binary())) -> list(binary()).
add_bools(Arguments) ->
do_add_bools(Arguments, []).