Current section

Files

Jump to
outil src outil@help.erl
Raw

src/outil@help.erl

-module(outil@help).
-compile(no_auto_import).
-export([wrap_usage/2]).
-spec wrap_usage(
outil:command(),
fun((list(binary())) -> {ok, EUN} | {error, outil@error:reason()})
) -> {ok, EUN} | {error, outil:command_return(any())}.
wrap_usage(Cmd, Continue) ->
Argv_contains = fun(S) -> gleam@list:contains(erlang:element(6, Cmd), S) end,
case case Argv_contains(<<"--help"/utf8>>)
orelse Argv_contains(<<"-h"/utf8>>) of
true ->
{error, {help, usage(Cmd)}};
false ->
{ok, erlang:element(6, Cmd)}
end of
{error, _try} -> {error, _try};
{ok, Args} ->
_pipe = Continue(Args),
gleam@result:map_error(
_pipe,
fun(_capture) -> {command_line_error, _capture, usage(Cmd)} end
)
end.
-spec usage(outil:command()) -> binary().
usage(Cmd) ->
Args = begin
_pipe = erlang:element(4, Cmd),
_pipe@1 = gleam@list:map(
_pipe,
fun(Arg) ->
<<<<"<"/utf8, (erlang:element(2, Arg))/binary>>/binary,
">"/utf8>>
end
),
gleam@string:join(_pipe@1, <<" "/utf8>>)
end,
Args@1 = case Args of
<<""/utf8>> ->
<<""/utf8>>;
_ ->
<<" "/utf8, Args/binary>>
end,
Usage = <<<<"\n\nUsage: "/utf8, (erlang:element(2, Cmd))/binary>>/binary,
Args@1/binary>>,
Opts = begin
_pipe@2 = erlang:element(5, Cmd),
_pipe@3 = gleam@list:map(_pipe@2, fun describe_opt/1),
_pipe@4 = gleam@list:map(
_pipe@3,
fun(Opt) -> <<" "/utf8, Opt/binary>> end
),
gleam@string:join(_pipe@4, <<"\n"/utf8>>)
end,
Opts@1 = case Opts of
<<""/utf8>> ->
<<""/utf8>>;
_ ->
<<"\n\nOptions:\n"/utf8, Opts/binary>>
end,
<<<<<<<<(erlang:element(2, Cmd))/binary, " -- "/utf8>>/binary,
(erlang:element(3, Cmd))/binary>>/binary,
Usage/binary>>/binary,
Opts@1/binary>>.
-spec describe_opt(outil:opt()) -> binary().
describe_opt(Opt) ->
{opt, Long, Short, Desc, Value} = Opt,
Short@1 = gleam@option:map(
Short,
fun(S) -> <<<<"-"/utf8, S/binary>>/binary, ", "/utf8>> end
),
Short@2 = gleam@option:unwrap(Short@1, <<""/utf8>>),
Long@1 = <<"--"/utf8, Long/binary>>,
Typ = opt_type(Value),
Default = show_default(Value),
Meta = <<<<<<<<"("/utf8, Typ/binary>>/binary, ", default: "/utf8>>/binary,
Default/binary>>/binary,
")"/utf8>>,
<<<<<<<<<<Short@2/binary, Long@1/binary>>/binary, " "/utf8>>/binary,
Desc/binary>>/binary,
" "/utf8>>/binary,
Meta/binary>>.
-spec opt_type(outil:opt_value()) -> binary().
opt_type(Value) ->
case Value of
bool_opt ->
<<"bool"/utf8>>;
{float_opt, _} ->
<<"float"/utf8>>;
{int_opt, _} ->
<<"int"/utf8>>;
{string_opt, _} ->
<<"string"/utf8>>
end.
-spec show_default(outil:opt_value()) -> binary().
show_default(Value) ->
case Value of
bool_opt ->
<<"false"/utf8>>;
{float_opt, Default} ->
gleam@float:to_string(Default);
{int_opt, Default@1} ->
gleam@int:to_string(Default@1);
{string_opt, Default@2} ->
<<<<"\""/utf8, Default@2/binary>>/binary, "\""/utf8>>
end.