Language Reference
Full syntax — every block, field, and diagnostic code
Referência de idioma
Referência de sintaxe completa para o Datro DSL (arquivos .dtro). Cada tipo de bloco, cada campo, cada código de diagnóstico — tudo em um só lugar.
Cabeçalho mágico
Todo arquivo .dtro deve começar com o cabeçalho mágico na linha 1. O analisador retorna E100 se estiver ausente ou malformado.
#!DATRO 1.0metabloco
Metadados opcionais em nível de documento. Produz dica de informação I003 se omitida. Todos os campos são strings/matrizes opcionais, exceto kind.
#!DATRO 1.0
meta {
title: "Payment Service"
version: "2.1.0"
description: "Handles card and crypto charges"
author: "jane@example.com"
owner: "payments-team"
tags: ["payments", "critical"]
sla: "99.95%"
criticality: "P0"
kind: architecture
}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
title | string | No | — | Título do diagrama legível por humanos |
version | string | No | — | Versão semântica do diagrama |
description | string | No | — | Descrição de texto livre |
author | string | No | — | Nome do autor ou e-mail |
owner | string | No | — | Equipe ou responsável |
tags | string[] | No | — | Tags de classificação arbitrária |
sla | string | No | — | Objetivo de nível de serviço, por ex. "99.9%" |
criticality | string | No | — | Nível de criticidade: "P0" | "high" | "medium" | "low" |
kind | DiagramKind "architecture""mindmap""state""sequence""algorithm" | No | architecture | Variante do diagrama |
bloco de nó
Declara uma entidade no diagrama. Cada nó possui um ID exclusivo, um type semântico que controla sua forma renderizada e cor padrão e um bloco attrs opcional para metadados.
# Minimal
node api_gw { type: gateway label: "API Gateway" }
# With attrs block
node payment_svc {
type: service
label: "Payment Service"
attrs {
tech: "nestjs"
owner: "payments-team"
deprecated: false
sla: "99.95%"
}
}
# Inline attrs (alternative syntax)
node db { type: database label: "Payments DB" attrs { tech: "postgres" } }| Field | Type | Required | Default | Description |
|---|---|---|---|---|
id | identifier | Yes | — | Identificador de nó exclusivo — alfanumérico + sublinhado |
type | NodeType "service""database""queue""cache""gateway""user""actor""system""external""process""storage""function""broker""scheduler""load_balancer""cdn""dns""firewall""client""mobile""web""iot""unknown" | No | unknown | Categoria de nó semântico |
label | string | No | (node id) | Exibir texto mostrado no diagrama |
group | identifier | No | — | ID do grupo ao qual este nó pertence (alternativa para group.members) |
attrs | AttrMap | No | — | Metadados de valores-chave arbitrários — strings, números, booleanos ou matrizes |
23 tipos de nós
Todos os 23 valores: service database queue cache gateway user actor system external process storage function broker scheduler load_balancer cdn dns firewall client mobile web iot unknown.
bloco de borda
Declara um relacionamento entre dois nós. A direção da borda é escrita diretamente na declaração: -> (direcionado), <-> (bidirecional) ou -- (não direcionado).
# Minimal
edge api_gw -> payment_svc { kind: http }
# Full metadata
edge payment_svc -> stripe {
kind: http
label: "charge API"
weight: 2.0
async: false
attrs { sla: "200ms" }
}
# Bidirectional edge
edge cache <-> service { kind: read }
# Undirected edge
edge svc_a -- svc_b { kind: depends }| Field | Type | Required | Default | Description |
|---|---|---|---|---|
from | identifier | Yes | — | ID do nó de origem |
direction | EdgeDir "->""<->""--" | Yes | — | Tipo de seta escrito em linha |
to | identifier | Yes | — | ID do nó de destino |
kind | EdgeKind "http""grpc""graphql""websocket""tcp""udp""query""event""publish""subscribe""stream""call""read""write""deploys""monitors""depends""extends""implements""triggers""unknown" | No | unknown | Tipo de relacionamento semântico – impulsiona cor e estilo |
label | string | No | — | Texto curto exibido na linha da borda |
weight | number | No | 1.0 | Peso relativo do tráfego – bordas mais pesadas ficam mais espessas |
async | boolean | No | false | Quando true, a borda é renderizada como tracejada (dispare e esqueça) |
attrs | AttrMap | No | — | Metadados arbitrários — passados para JSON IR e dicas de ferramentas |
21 tipos de borda
Todos os 21 valores: http grpc graphql websocket tcp udp query event publish subscribe stream call read write deploys monitors depends extends implements triggers unknown.
bloco de grupo
Agrupa nós relacionados em uma caixa de subgráfico rotulada. Um nó pode pertencer a no máximo um grupo — E403 dispara em conflitos. Os grupos podem ser aninhados: um ID de membro pode fazer referência a outro ID de grupo.
group data_tier {
label: "Data Layer"
members: [payments_db, fraud_cache, audit_log]
attrs { compliance: "PCI-DSS" }
}
# Alternative: assign group on the node
node payments_db {
type: database
label: "Payments DB"
group: data_tier
}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
id | identifier | Yes | — | Identificador exclusivo do grupo |
label | string | No | (group id) | Exibir rótulo para a caixa de subgráfico |
members | identifier[] | No | [] | IDs de nós ou grupos a serem incluídos — tem precedência sobre node { group: X } |
attrs | AttrMap | No | — | Metadados arbitrários |
bloco de restrição
Declara uma regra arquitetônica que o validador avalia em relação ao IR. Violações produzem E501 (ou W501 quando severity: warn). O campo rule usa uma gramática concisa de três tokens.
# Prohibition: databases may not call external services
constraint {
id: "no-db-external"
rule: "database !-> external"
message: "Databases must not connect directly to external APIs"
severity: error
}
# Requirement: every gateway must connect to a service
constraint {
rule: "gateway -> service"
message: "Each gateway must route to at least one service"
severity: warn
}
# Membership: all databases must be in the data_tier group
constraint {
rule: "database in data_tier"
message: "All database nodes must belong to the data_tier group"
severity: error
}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
id | string | No | — | Identificador de regra legível opcional |
rule | string | Yes | — | SUBJECT VERB OBJECT — veja a tabela de verbos abaixo |
message | string | No | — | Mensagem personalizada mostrada no diagnóstico quando a regra é violada |
severity | ConstraintSeverity "error""warn" | No | error | Gravidade do diagnóstico quando violado |
Verbos de restrição
- `!->` — nenhum nó
SUBJECTpode ter uma borda direcionada para qualquer nóOBJECT. - `->` — cada nó
SUBJECTdeve ter pelo menos uma aresta direcionada para um nóOBJECT. - `!<->` — nenhuma borda bidirecional pode existir entre os nós
SUBJECTeOBJECT. - `<->` — todo nó
SUBJECTdeve ter uma borda bidirecional para algum nóOBJECT. - `in` — cada nó
SUBJECTdeve ser membro do grupoOBJECT. - `!in` — nenhum nó
SUBJECTpode ser membro do grupoOBJECT.
Tokens de sujeito e objeto
Cada token pode ser um tipo de nó (database, external, …), um ID de grupo (por exemplo, data_tier) ou * (curinga correspondente a cada nó).
bloco de importação
Divide diagramas grandes em vários arquivos .dtro. O resolvedor mescla o IR importado no pai antes da validação. Use as para namespace e expose para colocar IDs específicos na lista de permissões.
# Import everything from another .dtro file
import "auth.dtro"
# Import with a namespace alias — IDs become auth.user_service, etc.
import "auth.dtro" as auth
# Import only specific IDs (whitelist)
import "infra.dtro" as infra expose [load_balancer, cdn]| Field | Type | Required | Default | Description |
|---|---|---|---|---|
path | string | Yes | — | Caminho relativo ou absoluto para o arquivo .dtro |
as | identifier | No | — | Alias de namespace — todos os IDs importados têm o prefixo alias.id |
expose | identifier[] | No | — | Lista de permissões – apenas esses IDs são mesclados no IR pai |
bloco de layout
Dicas para o renderizador sobre como organizar o gráfico. Todos os campos são opcionais — o renderizador usa padrões sensíveis quando o bloco é omitido.
layout {
direction: LR # LR | RL | TB | BT
algo: dagre # dagre | dot | elk | force | none
node_sep: 60 # px between nodes in the same rank
rank_sep: 120 # px between ranks
margin: 20 # graph margin in px
cluster_padding: 16 # padding inside group boxes
}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
direction | LayoutDirection "LR""RL""TB""BT" | No | LR | Direção do fluxo do gráfico |
algo | LayoutAlgo "dagre""dot""elk""force""none" | No | dagre | Algoritmo de layout |
node_sep | number | No | 60 | Pixels mínimos entre nós adjacentes na mesma classificação |
rank_sep | number | No | 120 | Pixels mínimos entre classificações |
margin | number | No | 20 | Margem do gráfico em pixels |
cluster_padding | number | No | 16 | Preenchimento extra dentro de caixas delimitadoras de grupo |
bloco temático
Controla a aparência visual do diagrama renderizado. O palette mapeia os tipos de nós para cores hexadecimais. O subbloco accessibility permite a verificação automática de contraste WCAG 2.1.
theme {
name: "Corporate"
palette {
service: "#D0E8FF"
database: "#FFE8C0"
gateway: "#FFD0D0"
queue: "#E8D0FF"
cache: "#C0FFE8"
external: "#F0F0F0"
background: "#FFFFFF"
}
typography {
font_family: "Inter, sans-serif"
node_font_size: 11
edge_font_size: 9
label_font_weight: "600"
}
accessibility {
min_contrast: AA # AA | AAA | none
max_label_length: 60
}
}Cor da fonte automática
O exportador DOT seleciona automaticamente texto em preto ou branco para cada preenchimento de nó usando a fórmula de luminância relativa WCAG 2.1. Você nunca precisa definir uma cor de texto separada.
bloco de estilo
Substituições refinadas por elemento aplicadas após o tema. Cascata de regras: by_id substitui by_type. Cada subbloco mapeia uma chave para um mapa de propriedades.
style {
# Override by node type
by_type {
database { fill: "#FFF3CD" stroke: "#E6A817" shape: cylinder }
external { fill: "#F8F9FA" stroke: "#6C757D" dash: true }
}
# Override individual node by id
by_id {
stripe { fill: "#635BFF" stroke: "#4B44CC" }
}
# Style edge kinds
by_edge_kind {
query { color: "#E6A817" width: 2 }
publish { color: "#198754" dash: true }
}
# Style edges that carry a boolean attr set to true
by_edge_attr {
async { dash: true color: "#ADB5BD" }
}
}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
by_type | Record<NodeType, StyleProps> | No | — | Estilos aplicados a todos os nós de um determinado tipo |
by_id | Record<id, StyleProps> | No | — | Estilos aplicados a um ID de nó específico – prioridade mais alta |
by_edge_kind | Record<EdgeKind, StyleProps> | No | — | Estilos aplicados a todas as arestas de um determinado tipo |
by_edge_attr | Record<attrName, StyleProps> | No | — | Estilos aplicados às arestas onde o atributo booleano nomeado é true |
Códigos de diagnóstico
Todos os diagnósticos incluem um local code, severity, message e um local opcional line:col. A tabela abaixo lista todos os códigos que o conjunto de ferramentas pode emitir.
Erros (E×××)
- `E100` — Cabeçalho mágico
#!DATRO 1.0ausente ou malformado - `E201` — ID do nó duplicado
- `E202` — O nó faz referência a um ID de grupo desconhecido
- `E301` — Nó de borda
fromnão encontrado - `E302` — Nó de borda
tonão encontrado - `E303` — A borda
weighté negativa - `E401` — ID de grupo duplicado
- `E402` — O grupo
membersfaz referência a um ID desconhecido - `E403` — O nó é atribuído a mais de um grupo
- `E404` — Aninhamento de grupo circular detectado
- `E500` — A regra de restrição tem um erro de sintaxe
- `E501` — A regra de restrição foi violada (a gravidade reflete a própria
severityda restrição)
Avisos (L×××)
- `W301` — Borda duplicada (igual de/para/tipo/rótulo)
- `W501` — A regra de restrição usa um verbo desconhecido
- `W601` — O rótulo do nó excede
max_label_length(padrão 80 caracteres) - `W602` — A cor da paleta do tema fica abaixo do contraste WCAG AA (4,5:1)
- `W603` — A cor da paleta do tema fica abaixo do contraste WCAG AAA (7,0:1)
Dicas de informação (I×××)
- `I001` — Nó isolado — nenhuma aresta se conecta a ele
- `I002` — Grupo vazio — nenhum membro declarado
- `I003` — Sem bloco
meta— recomendado para documentação - `I601` — Nenhuma paleta de tema definida — verificações de contraste ignoradas
Próximas etapas
- Use o CLI Reference para validar, formatar e exportar a partir da linha de comando.
- Incorpore diagramas no Markdown com o Markdown plugin.
- Volte para Quick Start para um passo a passo.
Experimente o idioma completo ao vivo – cole qualquer trecho acima e valide instantaneamente.