Current section

Files

Jump to
cactus src cactus@run.erl
Raw

src/cactus@run.erl

-module(cactus@run).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([get_actions/2, as_string/1, parse_action/1, run/2]).
-export_type([action_kind/0, action/0]).
-type action_kind() :: module | sub_command | binary.
-type action() :: {action, binary(), action_kind(), list(binary())}.
-spec get_actions(binary(), binary()) -> {ok, list(tom:toml())} |
{error, cactus@errors:cactus_err()}.
get_actions(Path, Action) ->
gleam@result:'try'(
cactus@util:parse_gleam_toml(Path),
fun(Manifest) ->
gleam@result:'try'(
cactus@errors:as_invalid_field_err(
tom:get_table(Manifest, [<<"cactus"/utf8>>, Action])
),
fun(Action_body) ->
cactus@errors:as_invalid_field_err(
tom:get_array(Action_body, [<<"actions"/utf8>>])
)
end
)
end
).
-spec as_string(tom:toml()) -> binary().
as_string(T) ->
case T of
{string, X} ->
X;
_ ->
gleam@io:println_error(<<"Invalid toml field"/utf8>>),
shellout_ffi:os_exit(1),
erlang:error(#{gleam_error => panic,
message => <<"unreachable"/utf8>>,
module => <<"cactus/run"/utf8>>,
function => <<"as_string"/utf8>>,
line => 95})
end.
-spec parse_action(tom:toml()) -> {ok, action()} |
{error, cactus@errors:cactus_err()}.
parse_action(Raw) ->
case Raw of
{inline_table, T} ->
gleam@result:'try'(
cactus@errors:as_invalid_field_err(
tom:get_string(T, [<<"command"/utf8>>])
),
fun(Command) ->
Kind = begin
_pipe = tom:get_string(T, [<<"kind"/utf8>>]),
_pipe@1 = gleam@result:map(
_pipe,
fun gleam@string:lowercase/1
),
gleam@result:unwrap(_pipe@1, <<"module"/utf8>>)
end,
Args = begin
_pipe@2 = tom:get_array(T, [<<"args"/utf8>>]),
_pipe@3 = gleam@result:unwrap(_pipe@2, []),
gleam@list:map(_pipe@3, fun as_string/1)
end,
Action_kind = case Kind of
<<"module"/utf8>> ->
module;
<<"sub_command"/utf8>> ->
sub_command;
<<"binary"/utf8>> ->
binary;
_ ->
module
end,
{ok, {action, Command, Action_kind, Args}}
end
);
_ ->
{error, invalid_toml_err}
end.
-spec run(binary(), binary()) -> {ok, list(binary())} |
{error, cactus@errors:cactus_err()}.
run(Path, Action) ->
gleam@result:'try'(
get_actions(Path, Action),
fun(Actions) -> _pipe = Actions,
_pipe@1 = gleam@list:map(_pipe, fun parse_action/1),
_pipe@2 = gleam@list:map(
_pipe@1,
fun(Parse_result) ->
gleam@result:'try'(
Parse_result,
fun(Action@1) ->
{Bin, Args} = case erlang:element(3, Action@1) of
module ->
{<<"gleam"/utf8>>,
lists:append(
[<<"run"/utf8>>,
<<"-m"/utf8>>,
erlang:element(2, Action@1),
<<"--"/utf8>>],
erlang:element(4, Action@1)
)};
sub_command ->
{<<"gleam"/utf8>>,
lists:append(
[erlang:element(2, Action@1)],
erlang:element(4, Action@1)
)};
binary ->
{erlang:element(2, Action@1),
erlang:element(4, Action@1)}
end,
gleam@io:println(
<<<<<<"Running: "/utf8, Bin/binary>>/binary,
" "/utf8>>/binary,
(gleam@string:join(Args, <<" "/utf8>>))/binary>>
),
case shellout:command(Bin, Args, <<"."/utf8>>, []) of
{ok, Res} ->
gleam@io:print(Res),
{ok, Res};
{error, {_, Err}} ->
{error, {action_failed_err, Err}}
end
end
)
end
),
gleam@result:all(_pipe@2) end
).