-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) -> _assert_subject = gleam@regex:from_string(<<"^[A-Za-z]"/utf8>>), {ok, Re} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail, module => <<"clad/internal/args"/utf8>>, function => <<"is_alpha"/utf8>>, line => 50}) end, gleam@regex:check(Re, Character). -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, []).