-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, none)}}; false -> {ok, erlang:element(6, Cmd)} end of {error, _try} -> {error, _try}; {ok, 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. -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 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>>, <<<<<<<<<>/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.