Current section

Files

Jump to
libero src libero@cli.erl
Raw

src/libero@cli.erl

-module(libero@cli).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/libero/cli.gleam").
-export([parse_args/1, parse_command/0]).
-export_type([database/0, command/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" CLI command router for the Libero framework.\n"
"\n"
" Usage: gleam run -m libero -- <command> [args]\n"
" Commands: new, add, gen, build\n"
).
-type database() :: postgres | sqlite.
-type command() :: {new, binary(), gleam@option:option(database())} |
{add, binary(), binary()} |
gen |
build |
unknown.
-file("src/libero/cli.gleam", 94).
-spec parse_database(binary()) -> {ok, database()} | {error, nil}.
parse_database(Value) ->
case Value of
<<"pg"/utf8>> ->
{ok, postgres};
<<"sqlite"/utf8>> ->
{ok, sqlite};
_ ->
{error, nil}
end.
-file("src/libero/cli.gleam", 30).
?DOC(
" Parse a list of argument strings into a Command.\n"
" Separated from parse_command so tests can call it without argv.\n"
).
-spec parse_args(list(binary())) -> command().
parse_args(Args) ->
case Args of
[<<"new"/utf8>>, Name, <<"--database"/utf8>>, Db | _] ->
case parse_database(Db) of
{ok, Database} ->
{new, Name, {some, Database}};
{error, nil} ->
gleam_stdlib:println_error(
<<<<"error: Invalid database: `"/utf8, Db/binary>>/binary,
"`
\x{2502}
\x{2502} --database must be \"pg\" or \"sqlite\"
\x{2502}
hint: gleam run -m libero -- new my_app --database pg"/utf8>>
),
unknown
end;
[<<"new"/utf8>>, _, <<"--database"/utf8>>] ->
gleam_stdlib:println_error(
<<"error: Missing database value
\x{2502}
\x{2502} --database requires a value
\x{2502}
hint: gleam run -m libero -- new my_app --database pg
gleam run -m libero -- new my_app --database sqlite"/utf8>>
),
unknown;
[<<"new"/utf8>>, Name@1 | _] ->
{new, Name@1, none};
[<<"add"/utf8>>, Name@2, <<"--target"/utf8>>, Target | _] ->
case Target of
<<"javascript"/utf8>> ->
{add, Name@2, Target};
<<"erlang"/utf8>> ->
{add, Name@2, Target};
_ ->
gleam_stdlib:println_error(
<<<<<<<<"error: Invalid target: `"/utf8, Target/binary>>/binary,
"`
\x{2502}
\x{2502} --target must be \"javascript\" or \"erlang\"
\x{2502}
hint: gleam run -m libero -- add "/utf8>>/binary,
Name@2/binary>>/binary,
" --target javascript"/utf8>>
),
unknown
end;
[<<"add"/utf8>>, _ | _] ->
gleam_stdlib:println_error(
<<"error: Missing --target flag
\x{2502}
\x{2502} The add command requires a target
\x{2502}
hint: gleam run -m libero -- add <name> --target javascript"/utf8>>
),
unknown;
[<<"gen"/utf8>> | _] ->
gen;
[<<"build"/utf8>> | _] ->
build;
[<<"new"/utf8>>] ->
gleam_stdlib:println_error(
<<"error: Missing project name
\x{2502}
\x{2502} The new command requires a project name
\x{2502}
hint: gleam run -m libero -- new my_app"/utf8>>
),
unknown;
_ ->
unknown
end.
-file("src/libero/cli.gleam", 24).
?DOC(" Parse CLI arguments into a Command.\n").
-spec parse_command() -> command().
parse_command() ->
parse_args(erlang:element(4, argv:load())).