-module(clad). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([list/1, decode/2, positional_arguments/1, optional_opt/5, flag/3, opt/4]). -export_type([state/0]). -type state() :: {state, gleam@dict:dict(binary(), gleam@dynamic:dynamic_()), gleam@dict:dict(binary(), list(gleam@dynamic:dynamic_())), list(binary())}. -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 316). -spec is_number(binary()) -> boolean(). is_number(Str) -> case gleam@regexp:from_string( <<"^[-+]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)$"/utf8>> ) of {ok, Re} -> gleam@regexp:check(Re, Str); {error, _} -> false end. -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 323). -spec is_alpha(binary()) -> boolean(). is_alpha(Str) -> case gleam@regexp:from_string(<<"^[a-zA-Z]+$"/utf8>>) of {ok, Re} -> gleam@regexp:check(Re, Str); {error, _} -> false end. -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 486). -spec append_positional(state(), binary()) -> state(). append_positional(State, Value) -> Positional = [Value | erlang:element(4, State)], erlang:setelement(4, State, Positional). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 498). -spec try_parse_float(binary()) -> {ok, gleam@dynamic:dynamic_()} | {error, nil}. try_parse_float(Input) -> _pipe = gleam_stdlib:parse_float(Input), gleam@result:map(_pipe, fun gleam_stdlib:identity/1). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 503). -spec try_parse_int(binary()) -> {ok, gleam@dynamic:dynamic_()} | {error, nil}. try_parse_int(Input) -> _pipe = gleam_stdlib:parse_int(Input), gleam@result:map(_pipe, fun gleam_stdlib:identity/1). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 508). -spec try_parse_bool(binary()) -> {ok, gleam@dynamic:dynamic_()} | {error, nil}. try_parse_bool(Input) -> case Input of <<"true"/utf8>> -> {ok, gleam_stdlib:identity(true)}; <<"True"/utf8>> -> {ok, gleam_stdlib:identity(true)}; <<"false"/utf8>> -> {ok, gleam_stdlib:identity(false)}; <<"False"/utf8>> -> {ok, gleam_stdlib:identity(false)}; _ -> {error, nil} end. -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 491). -spec parse_value(binary()) -> gleam@dynamic:dynamic_(). parse_value(Input) -> _pipe = try_parse_float(Input), _pipe@1 = gleam@result:'or'(_pipe, try_parse_int(Input)), _pipe@2 = gleam@result:'or'(_pipe@1, try_parse_bool(Input)), gleam@result:unwrap(_pipe@2, gleam_stdlib:identity(Input)). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 410). -spec set_arg(state(), binary(), binary()) -> state(). set_arg(State, Key, Value) -> In_opt = gleam_stdlib:map_get(erlang:element(2, State), Key), In_list = gleam_stdlib:map_get(erlang:element(3, State), Key), case {In_opt, In_list} of {{error, _}, {error, _}} -> Opts = gleam@dict:insert( erlang:element(2, State), Key, parse_value(Value) ), erlang:setelement(2, State, Opts); {{ok, V}, _} -> Opts@1 = gleam@dict:delete(erlang:element(2, State), Key), List_opts = gleam@dict:insert( erlang:element(3, State), Key, [parse_value(Value), V] ), erlang:setelement(3, erlang:setelement(2, State, Opts@1), List_opts); {_, {ok, Values}} -> List_opts@1 = gleam@dict:insert( erlang:element(3, State), Key, [parse_value(Value) | Values] ), erlang:setelement(3, State, List_opts@1) end. -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 431). -spec parse_short(binary(), state()) -> {state(), gleam@option:option(binary())}. parse_short(Arg, State) -> case gleam_stdlib:string_pop_grapheme(Arg) of {ok, {H, <<""/utf8>>}} -> {State, {some, H}}; {ok, {H@1, Rest}} -> case {is_alpha(H@1), is_number(Rest)} of {true, true} -> {set_arg(State, H@1, Rest), none}; {_, _} -> New_state = set_arg(State, H@1, <<"true"/utf8>>), parse_short(Rest, New_state) end; _ -> {State, none} end. -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 464). -spec parse_cluster(binary(), state(), gleam@option:option(binary())) -> {state(), list(binary())}. parse_cluster(Cluster, State, Next) -> case gleam_stdlib:string_pop_grapheme(Cluster) of {ok, {H, Rest}} -> case {is_alpha(H), is_number(Rest)} of {true, true} -> {set_arg(State, H, Rest), begin _pipe = gleam@option:map( Next, fun gleam@list:wrap/1 ), gleam@option:unwrap(_pipe, []) end}; {_, _} -> New_state = set_arg(State, H, <<"true"/utf8>>), parse_short_arg(Rest, New_state, Next) end; _ -> {State, begin _pipe@1 = gleam@option:map(Next, fun gleam@list:wrap/1), gleam@option:unwrap(_pipe@1, []) end} end. -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 447). -spec parse_short_arg(binary(), state(), gleam@option:option(binary())) -> {state(), list(binary())}. parse_short_arg(Arg, State, Next) -> case string:length(Arg) of 1 -> Value = gleam@option:unwrap(Next, <<"true"/utf8>>), New_state = set_arg(State, Arg, Value), {New_state, []}; _ -> parse_cluster(Arg, State, Next) end. -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 292). -spec list(gleam@dynamic@decode:decoder(FJB)) -> gleam@dynamic@decode:decoder(list(FJB)). list(Inner) -> Single = begin _pipe = Inner, gleam@dynamic@decode:map(_pipe, fun gleam@list:wrap/1) end, gleam@dynamic@decode:one_of(gleam@dynamic@decode:list(Inner), [Single]). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 163). -spec decode(list(binary()), gleam@dynamic@decode:decoder(FHY)) -> {ok, FHY} | {error, list(gleam@dynamic@decode:decode_error())}. decode(Args, Decoder) -> _pipe = parse(Args), _pipe@1 = to_dynamic(_pipe), gleam@dynamic@decode:run(_pipe@1, Decoder). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 297). -spec parse(list(binary())) -> state(). parse(Args) -> State = {state, maps:new(), maps:new(), gleam@list:new()}, State@1 = parse_args(Args, State), erlang:setelement(4, State@1, lists:reverse(erlang:element(4, State@1))). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 189). -spec positional_arguments( fun((list(binary())) -> gleam@dynamic@decode:decoder(FIE)) ) -> gleam@dynamic@decode:decoder(FIE). positional_arguments(Next) -> gleam@dynamic@decode:field( <<"_"/utf8>>, gleam@dynamic@decode:list( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Args) -> Next(Args) end ). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 247). -spec optional_field( any(), gleam@dynamic@decode:decoder(FIQ), fun((gleam@option:option(FIQ)) -> gleam@dynamic@decode:decoder(FIT)) ) -> gleam@dynamic@decode:decoder(FIT). optional_field(Field_name, Field_decoder, Next) -> gleam@dynamic@decode:optional_field( Field_name, none, gleam@dynamic@decode:optional(Field_decoder), Next ). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 233). -spec optional_opt( binary(), binary(), FIK, gleam@dynamic@decode:decoder(FIK), fun((FIK) -> gleam@dynamic@decode:decoder(FIM)) ) -> gleam@dynamic@decode:decoder(FIM). optional_opt(Long_name, Short_name, Default, Field_decoder, Next) -> optional_field(Long_name, Field_decoder, fun(Value) -> case Value of {some, V} -> Next(V); none -> gleam@dynamic@decode:optional_field( Short_name, Default, Field_decoder, Next ) end end). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 211). -spec flag( binary(), binary(), fun((boolean()) -> gleam@dynamic@decode:decoder(FIH)) ) -> gleam@dynamic@decode:decoder(FIH). flag(Long_name, Short_name, Next) -> optional_opt( Long_name, Short_name, false, {decoder, fun gleam@dynamic@decode:decode_bool/1}, Next ). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 268). -spec opt( binary(), binary(), gleam@dynamic@decode:decoder(FIW), fun((FIW) -> gleam@dynamic@decode:decoder(FIY)) ) -> gleam@dynamic@decode:decoder(FIY). opt(Long_name, Short_name, Field_decoder, Next) -> optional_field(Long_name, Field_decoder, fun(Value) -> case Value of {some, V} -> Next(V); none -> gleam@dynamic@decode:field(Short_name, Field_decoder, Next) end end). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 304). -spec to_dynamic(state()) -> gleam@dynamic:dynamic_(). to_dynamic(State) -> List_opts = gleam@dict:map_values( erlang:element(3, State), fun(_, Values) -> _pipe = lists:reverse(Values), gleam_stdlib:identity(_pipe) end ), _pipe@1 = erlang:element(2, State), _pipe@2 = maps:merge(_pipe@1, List_opts), _pipe@3 = gleam@dict:insert( _pipe@2, <<"_"/utf8>>, gleam_stdlib:identity(erlang:element(4, State)) ), gleam_stdlib:identity(_pipe@3). -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 340). -spec parse_arg(binary(), list(binary()), state()) -> {state(), list(binary())}. parse_arg(Arg, Rest, State) -> case Arg of <<"--"/utf8>> -> Positional = begin _pipe = [lists:reverse(Rest), erlang:element(4, State)], gleam@list:flatten(_pipe) end, New_state = erlang:setelement(4, State, Positional), {New_state, []}; <<"--"/utf8, Key/binary>> -> case gleam@string:split(Key, <<"="/utf8>>) of [Key@1, Value] -> New_state@1 = set_arg(State, Key@1, Value), {New_state@1, Rest}; _ -> case Rest of [] -> New_state@2 = set_arg(State, Key, <<"true"/utf8>>), {New_state@2, Rest}; [<<"-"/utf8, _/binary>> | _] -> New_state@2 = set_arg(State, Key, <<"true"/utf8>>), {New_state@2, Rest}; [Next | Rest@1] -> New_state@3 = set_arg(State, Key, Next), {New_state@3, Rest@1} end end; <<"-"/utf8, Key@2/binary>> -> case gleam@string:split(Key@2, <<"="/utf8>>) of [Key@3, Value@1] -> case gleam_stdlib:string_pop_grapheme(Key@3) of {ok, {Key@4, _}} -> New_state@4 = set_arg(State, Key@4, Value@1), {New_state@4, Rest}; _ -> {State, Rest} end; _ -> case Rest of [] -> case parse_short(Key@2, State) of {New_state@5, {some, K}} -> {set_arg(New_state@5, K, <<"true"/utf8>>), Rest}; {New_state@6, none} -> {New_state@6, Rest} end; [<<"-"/utf8, _/binary>> | _] -> case parse_short(Key@2, State) of {New_state@5, {some, K}} -> {set_arg(New_state@5, K, <<"true"/utf8>>), Rest}; {New_state@6, none} -> {New_state@6, Rest} end; [Next@1 | New_rest] -> case parse_short(Key@2, State) of {New_state@7, {some, K@1}} -> {set_arg(New_state@7, K@1, Next@1), New_rest}; {New_state@8, none} -> {New_state@8, Rest} end end end; _ -> New_state@9 = append_positional(State, Arg), {New_state@9, Rest} end. -file("/Users/ryan.miville/dev/clad/src/clad.gleam", 330). -spec parse_args(list(binary()), state()) -> state(). parse_args(Args, State) -> case Args of [] -> State; [Arg | Rest] -> {New_state, Rest@1} = parse_arg(Arg, Rest, State), parse_args(Rest@1, New_state) end.