Pular para o conteúdo

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"]
TipoNa linha
texto--nome valor
inteiro · numeroconvertidos, 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ão

O 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()