Gleam.br Wiki

🧠 Gleam BR: BPMN/DMN (Business Process Engine) | Governança

Especificação técnica e manual do componente gbr_bpm.

🧠 Gleam BR: BPMN/DMN (Business Process Engine)

Package Version Hex Docs

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