Packages
A Gleam library for writing command line tools.
Current section
Files
Jump to
Current section
Files
src/outil@help.erl
-module(outil@help).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function]).
-export([wrap_usage/2]).
-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.
-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 usage(outil:command(), gleam@option:option(binary())) -> binary().
usage(Cmd, Err_desc) ->
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 = <<<<<<"\n\nOptions:\n"/utf8, Opts/binary>>/binary, "\n"/utf8>>/binary,
" -h, --help Show this help text and exit."/utf8>>,
Desc@1 = begin
_pipe@5 = Err_desc,
_pipe@6 = gleam@option:map(
_pipe@5,
fun(Desc) -> <<"ERROR! "/utf8, Desc/binary>> end
),
gleam@option:unwrap(_pipe@6, erlang:element(3, Cmd))
end,
<<<<<<<<(erlang:element(2, Cmd))/binary, " -- "/utf8>>/binary,
Desc@1/binary>>/binary,
Usage/binary>>/binary,
Opts@1/binary>>.
-spec wrap_usage(
outil:command(),
fun((list(binary())) -> {ok, FIE} | {error, outil@error:reason()})
) -> {ok, FIE} | {error, outil:command_return(any())}.
wrap_usage(Cmd, Continue) ->
Argv_contains = fun(S) -> gleam@list:contains(erlang:element(6, Cmd), S) end,
gleam@result:then(
case Argv_contains(<<"--help"/utf8>>) orelse Argv_contains(
<<"-h"/utf8>>
) of
true ->
{error, {help, usage(Cmd, none)}};
false ->
{ok, erlang:element(6, Cmd)}
end,
fun(Args) -> _pipe = Continue(Args),
gleam@result:map_error(
_pipe,
fun(Reason) ->
Err_desc = case Reason of
{missing_argument, Opt} ->
<<"Missing argument for option: "/utf8, Opt/binary>>;
{malformed_argument, Opt@1, Value} ->
<<<<<<<<"Malformed argument for option: "/utf8,
Opt@1/binary>>/binary,
" ("/utf8>>/binary,
Value/binary>>/binary,
")"/utf8>>;
{out_of_place_option, Opt@2} ->
<<"Out of place option: "/utf8, Opt@2/binary>>
end,
{command_line_error, Reason, usage(Cmd, {some, Err_desc})}
end
) end
).