-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, []).