Plugins do check
A regra que o seu projeto cobra, rodando no mesmo comando das 177 embutidas — com linha, coluna, código e silenciamento.
O dataforge check tem 177 regras. O que ele não sabe é a regra do seu projeto: "toda rota precisa de middleware de autenticação", "nenhum blueprint de domínio pode adotar Arcane.Http", "nome de uma letra não passa". Um plugin é um .df que responde isso.
Um plugin é uma ação#
adopt Arcane.Macro as M
action verificar(arvore, arquivo):
achados := []
action olhar(nodo):
given nodo["tipo"] is "Identifier" and len(nodo["nome"]) is 1:
achados.append({"linha": nodo["linha"], "coluna": nodo["coluna"],
"codigo": "sem-nome-curto",
"mensagem": "nome de uma letra nao diz nada",
"sugestao": "use um nome que se leia",
"severidade": "aviso"})
M.percorrer(arvore, olhar)
yield achados
relay verificarRode com --plugin, ou declare no manifesto e esqueça:
dataforge check src/ --plugin=regras.df[check]
plugins = ["regras.df"]
O contrato#
| Campo do achado | O que é |
|---|---|
linha, coluna | onde acusar — vêm do nó (nodo["linha"]) |
codigo | o nome da regra; aparece na mensagem e serve para silenciar |
mensagem | o que está errado |
sugestao | o que fazer — a parte que faz a diferença |
severidade | "erro" (padrão) ou "aviso"; erro reprova o comando |
A ação recebe a árvore (o mesmo dado de `M.arvore`) e o caminho do arquivo, e devolve um cluster de achados. Nada mais.
Silenciar uma regra de plugin#
O mesmo escape das regras embutidas vale aqui — e vale porque, sem ele, a única saída de quem discorda seria desligar o plugin inteiro:
x := 1 // df: permitir sem-nome-curtoUm plugin quebrado não derruba o check#
Se o plugin não carrega, ou falha no meio, isso vira diagnóstico — com o nome do arquivo e o motivo. Quem roda o check quer o relatório do código dele, e não a pilha do analisador.
// saída quando o plugin falha:
//
// alvo.df:1:1: erro: o plugin 'ruim.df' falhou: quebrei
// sugestão: conserte o plugin, ou tire-o da lista
out "veja o bloco acima" O que um plugin alcança#
| Dá para fazer | Como |
|---|---|
| lint próprio | percorrer a árvore e acusar o que a equipe combinou |
| análise de fluxo simples | seguir a ordem das instruções dentro de uma ação |
| convenção de arquitetura | olhar adopt e acusar dependência proibida entre camadas |
| verificação de esquema | ler um .json do projeto e conferir contra o que o código declara |
| Não dá | Por quê |
|---|---|
| transformar a árvore antes de rodar | o plugin do check analisa; reescrever é trabalho de macro, que roda na carga do arquivo |
| adicionar palavra à linguagem | isso é o parser, e mexe no DataForge |
| rodar a cada tecla no editor | o LSP usa as regras embutidas; o plugin roda no comando |