ВСТУП
Модуль MAD надає інтерфейс користувача для команд консолі.
Профіль
Кожен профіль MAD повинен забезпечувати відкритий API:
-define(MAD,[compile/1,app/1,get/1,release/1,resolve/1,clean/1,
start/1,attach/1,stop/1,sh/1,deps/1,up/1,fetch/1,
static/1,eunit/1,strip/1]).
-type return() :: [] | {ok,any()} | {error,any()}.
Кожна функція з відкритого API має одинаковий підпис від списку строк до суми nil та error протоколів.
compile(list(string())) -> return().
app(list(string())) -> return().
get(list(string())) -> return().
release(list(string())) -> return().
clean(list(string())) -> return().
start(list(string())) -> return().
stop(list(string())) -> return().
sh(list(string())) -> return().
deps(list(string())) -> return().
up(list(string())) -> return().
sh(list(string())) -> return().
fetch(list(string())) -> return().
static(list(string())) -> return().
eunit(list(string())) -> return().
strip(list(string())) -> return().
LOOP
main(list(string())) -> integer().
Простий та зрозумілий цикл обробки команд та помилок. Функція atomize/1 допомагає зберігати відомі аргументи як атоми. Функція profile/0 отримує модуль з реалізацією MAD API. Функція main/1 повертає статус помилки в операційну систему, з завершенням роботи.
main(Params) ->
{ _Invalid, Valid } = lists:foldr(
fun (X,{C,R}) when is_atom(X) -> {[],[{X,C}|R]};
(X,{C,R}) -> {[X|C],R}
end, {[],[]}, lists:map(fun atomize/1, Params)),
halt(return(
lists:any(fun({error,X}) -> mad:info("~s~n",[X]), true;
(_) -> false end,
lists:flatten([
lists:foldl(
fun ({Fun,Arg},ErrAcc) ->
mad_hooks:run_hooks(pre, Fun),
Errors = errors((profile()):Fun(Arg)),
mad_hooks:run_hooks(post, Fun),
Errors ++ ErrAcc
end, [], Valid)])))).
Цей модуль може бути пов'язаним з: mad_local.