Skip to content

Commit

Permalink
Approach the rebar3 alias implementation
Browse files Browse the repository at this point in the history
This is a quick and dirty solution pushed for discussion purposes
  • Loading branch information
paulo-ferraz-oliveira committed Aug 25, 2023
1 parent 9ae99e9 commit 52ee5b8
Showing 1 changed file with 47 additions and 10 deletions.
57 changes: 47 additions & 10 deletions apps/rebar/src/rebar_prv_alias.erl
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,63 @@
%%% years of stability. Only some error checks were added
-module(rebar_prv_alias).

-export([init/1]).
-behaviour(provider).

-export([init/1, do/1, format_error/1]).
-include("rebar.hrl").

-define(PROVIDER, alias).
-define(IMPL_PREFIX, "rebar_prv_alias_").
-define(DESC_PREFIX, "Equivalent to running: rebar3 do ").

%% ===================================================================
%% Public API
%% ===================================================================
-spec init(rebar_state:t()) -> {ok, rebar_state:t()}.
init(State) ->
Aliases = rebar_state:get(State, alias, []),
lists:foldl(fun({Alias, Cmds}, {ok, StateAcc}) ->
case validate_provider(Alias, Cmds, State) of
true -> init_alias(Alias, Cmds, StateAcc);
false -> {ok, State}
end
end, {ok, State}, Aliases).
{ok, State1}
= lists:foldl(fun({Alias, Cmds}, {ok, StateAcc}) ->
case validate_provider(Alias, Cmds, State) of
true -> init_alias(Alias, Cmds, StateAcc);
false -> {ok, State}
end
end, {ok, State}, Aliases),
State2 = rebar_state:add_provider(State1, providers:create([{name, ?PROVIDER},
{module, ?MODULE},
{bare, true},
{deps, []},
{example, "rebar3 alias"},
{short_desc, "List defined aliases."},
{desc, "List defined aliases."},
{opts, []}])),
{ok, State2}.

-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
do(State) ->
ImplPrefixLen = length(?IMPL_PREFIX),
lists:foreach(
fun (Provider) ->
MaybePrvAlias = atom_to_list(providers:module(Provider)),
case string:sub_string(MaybePrvAlias, 1, ImplPrefixLen) =:= ?IMPL_PREFIX of
true ->
Alias = string:sub_string(MaybePrvAlias, ImplPrefixLen + 1),
DescSuf = string:sub_string(providers:desc(Provider), length(?DESC_PREFIX) + 1),
?CONSOLE("~ts=~ts", [Alias, DescSuf]);
false -> ok
end
end,
rebar_state:providers(State)
),
{ok, State}.

-spec format_error(any()) -> iolist().
format_error(Reason) ->
io_lib:format("~p", [Reason]).

-dialyzer([{no_opaque, init_alias/3}, {no_return, init_alias/3}]). % warnings relate to use of opaque structures in :forms
init_alias(Alias, Cmds, State) ->
Module = list_to_atom("rebar_prv_alias_" ++ atom_to_list(Alias)),
Module = list_to_atom(?IMPL_PREFIX ++ atom_to_list(Alias)),

MF = module(Module),
EF = exports(),
Expand Down Expand Up @@ -72,8 +110,7 @@ example(Alias) ->

-dialyzer({no_unused, desc/1}). % required since we suppress warnings for init_alias/3
desc(Cmds) ->
"Equivalent to running: rebar3 do "
++ rebar_string:join(lists:map(fun to_desc/1, Cmds), ",").
?DESC_PREFIX ++ rebar_string:join(lists:map(fun to_desc/1, Cmds), ",").

to_desc({Cmd, Args}) when is_list(Args) ->
atom_to_list(Cmd) ++ " " ++ Args;
Expand Down

0 comments on commit 52ee5b8

Please sign in to comment.