Arcane.Cli
A linha de comando de um programa escrito em DataForge: opções tipadas, subcomandos, ajuda gerada e perguntas no terminal.
O dataforge tem uma CLI completa. Um programa escrito em DataForge não tinha nada: OS.args() devolve a lista crua, e ler --porta=8080 dela é escrever o mesmo laço de novo em cada programa.
Declarar#
dataforge
adopt Arcane.Cli as Cli
app := Cli.comando("relatorio", sobre := "Gera o relatório do mês.",
versao := "1.0.0")
app.opcao("mes", "inteiro", curta := "m", exigida := yes, sobre := "de 1 a 12")
app.opcao("formato", escolhas := ["csv", "json"], padrao := "csv")
app.opcao("enviar", "sim_nao", sobre := "manda por e-mail")
app.posicional("saida", exigido := no)
app.exemplo("relatorio -m 9 --formato json out.json")
opcoes := app.rodar()
out opcoes["mes"], opcoes["formato"]| Tipo | Na linha |
|---|---|
texto | --nome valor |
inteiro · numero | convertidos, e recusados se não forem |
sim_nao | --nome (sem valor) |
lista | --nome a,b,c |
As formas aceitas são as de sempre: --porta 9000, --porta=9000, -p 9000 e -p9000.
A ajuda sai da declaração#
text
Sobe a forja.
uso: forja [opções] [config]
opções:
-p, --porta INTEIRO a porta (padrão: 8080)
--modo TEXTO o ambiente (dev|prod; padrão: dev)
-v, --verboso fala mais
-h, --ajuda mostra esta ajuda
--versao mostra a versãoO erro sugere#
bash
$ relatorio --mess 9
relatorio: não conheço '--mess'.
Você quis dizer '--mes'?
$ relatorio --mes abc
relatorio: '--mes' espera inteiro e recebeu 'abc'.
$ relatorio --formato xml
relatorio: '--formato' aceita csv, json — veio 'xml'.Subcomandos#
dataforge
app := Cli.comando("forja")
subir := app.subcomando("subir", "põe no ar")
subir.opcao("porta", "inteiro", padrao := 8080)
app.subcomando("parar", "tira do ar")
opcoes := app.rodar()
match opcoes["__comando__"]:
point "subir":
subir_servidor(opcoes["porta"])
point "parar":
parar_servidor()Perguntar#
dataforge
nome := Cli.perguntar("Nome do projeto", padrao := "meu-app")
banco := Cli.escolher("Banco?", ["SQLite", "Postgres", "MySQL"])
senha := Cli.segredo("Senha do banco")
given Cli.confirmar("Apagar tudo?", padrao := no):
apagar()Console interativo#
dataforge
c := Cli.console("forja> ", sobre := "Console da forja.")
c.registrar("listar", lambda _ => listar_pedidos(), "mostra os pedidos")
c.registrar("ver", lambda id => ver(id), "detalha um pedido")
c.rodar()