🧠 Gleam BR: BPMN/DMN (Business Process Engine) | Governança
🧠 Gleam BR: BPMN/DMN (Business Process Engine)
O *gbr_bpm* é o Motor de Regras de Negócio e Processos (Business Process Engine) puro. Construído com base nos princípios de Topologia Algébrica e Teoria das Categorias, ele avalia diagramas de processos (como BPMN 2.0) mapeando as especificações e estados diretamente para Tipos de Dados Algébricos (ADTs), sem qualquer efeito colateral impuro (side-effects).
🧐 When and Why to Use It (Quando e Por Que Usar)
**Use o gbr_bpm quando:**
- Precisar modelar regras de negócio complexas, fluxos de decisão (Gateways) ou processos em etapas.
- Precisar de um motor de avaliação matemático rigoroso, rápido e imutável (sem acesso a banco de dados ou estado mutável durante o passo de decisão).
- Estiver desenvolvendo domínios core onde testes determinísticos (Dream/BDD) e zero-side-effects são obrigatórios.
- Quiser representar fluxos de negócio em uma AST (Árvore Sintática Abstrata) e computá-los de forma agnóstica.
*Não use se:*
- Precisar fazer chamadas de rede (I/O) nativas dentro da regra. O gbr_bpm apenas retorna Efeitos (Effects); o seu executor OTP (como gbr_monitor) é quem deve aplicar o I/O.
- Seu fluxo é tão simples que três linhas de código com case já resolvem, e modelar uma Rede de Petri adicionaria complexidade desnecessária.
🏗️ Arquitetura e Funcionalidades
1. Tipos de Dados Algébricos (gbr/bpm/core)
Todos os conceitos (Tarefas, Eventos de Início/Fim, Fluxos) são representados por Custom Types. Ao invés de uma linguagem de script amarrada a texto, os processos são topologias de grafos instanciados na memória.
2. A Máquina de Estados Pura (gbr/bpm/machine)
A função machine.step recebe o Diagrama de Processo (ProcessDef) e o Estado Atual (ExecutionToken) e avança a "ficha" (Token) pela Rede de Petri. O retorno é sempre o Novo Estado e a lista de Efeitos a serem executados (ex: TriggerAlert). Se houver falhas de roteamento, retorna erros determinísticos (Result).
3. AST e Lógica Segura (gbr/bpm/ast)
As condições de roteamento não usam "Erlang sujo" ou eval inseguro. Elas são montadas usando uma Árvore Sintática Abstrata (Expr) onde operadores (Add, GreaterThan) e variáveis operam dentro de um "Sandbox" fechado. Isso garante que nunca teremos vazamentos de escopo.
🚀 Instalação e Uso
Adicione ao seu projeto Gleam:
gleam add gbr_bpm
Exemplo Básico
import gbr/bpm/core
import gbr/bpm/machine
import gbr/bpm/ast
import gleam/dict
import gleam/option
pub fn main() {
// 1. Crie os Nós e Fluxos
let nodes = dict.from_list([
#("start", core.StartEvent("start")),
#("task", core.Task("task", core.RuleTask)),
#("end", core.EndEvent("end"))
])
let flows = [
core.SequenceFlow("f1", "start", "task", option.None),
core.SequenceFlow("f2", "task", "end", option.None)
]
let process = core.ProcessDef("meu_processo", nodes, flows)
// 2. Crie o Token Inicial
let token = core.ExecutionToken("meu_processo", "start", dict.new())
// 3. Avance a Máquina de Estados (com persistência opcional None)
let assert Ok(#(novo_token, efeitos)) = machine.step(process, token, option.None)
}
🛠️ Desenvolvimento
gleam check # Verificar sintaxe e tipos
gleam test # Rodar os testes isolados Gleeunit