Subcomandos
git-style: um programa, vários verbos — e a ajuda de cada um.
git commit, docker run, dataforge check. Quando a ferramenta cresce, o verbo vira o primeiro argumento, e cada verbo tem as suas opções.
dataforge
adopt Arcane.Cli as Cli
app := Cli.comando("tarefa", "Gerenciador de tarefas", "2.0.0")
criar := app.subcomando("criar", "cria uma tarefa")
criar.posicional("titulo", "o título")
criar.opcao("prazo", "texto", "p", "", "quando vence")
listar := app.subcomando("listar", "lista as tarefas")
listar.opcao("todas", "sim_nao", "a", no, "inclusive as concluídas")
args := app.ler(["criar", "comprar café", "--prazo=amanhã"])
assert args["__comando__"] is "criar"
assert args["titulo"] is "comprar café"
assert args["prazo"] is "amanhã"
args := app.ler(["listar", "-a"])
assert args["__comando__"] is "listar"
assert args["todas"] is yesDespachar#
Um vault de ações é melhor que uma escada de given: acrescentar um verbo passa a ser acrescentar uma entrada, e a lista de verbos vira dado — dá para listá-la, testá-la e conferi-la.
dataforge
adopt Arcane.Cli as Cli
action criar(args):
yield $"criada: {args['titulo']}"
action listar(args):
yield "3 tarefas"
VERBOS := {"criar": criar, "listar": listar}
app := Cli.comando("tarefa", "")
c := app.subcomando("criar", "")
c.posicional("titulo", "")
app.subcomando("listar", "")
args := app.ler(["criar", "café"])
acao := VERBOS[args["__comando__"]]
assert acao(args) is "criada: café"
// e a lista de verbos é DADO: dá para conferir que nenhum ficou sem ação
assert sorted(keys(VERBOS)) is ["criar", "listar"]A ajuda do programa lista os verbos#
dataforge
adopt Arcane.Cli as Cli
app := Cli.comando("tarefa", "Gerenciador de tarefas")
app.subcomando("criar", "cria uma tarefa")
app.subcomando("listar", "lista as tarefas")
texto := app.ajuda()
assert "criar" in texto and "cria uma tarefa" in texto
out textoUm verbo que não existe#
dataforge
adopt Arcane.Cli as Cli
app := Cli.comando("tarefa", "")
app.subcomando("criar", "")
app.subcomando("listar", "")
monitor:
app.ler(["crear", "x"]) // erro de digitação
assert no
handle Error as e:
out e.messageUma sugestão ("você quis dizer criar?") é o que transforma um erro de digitação em um segundo de perda, em vez de uma ida à documentação.