Diagram Maker›Language Reference
📐

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.

23 tipos de nós21 tipos de borda6 verbos de restriçãoWCAG 2.1 AA/AAA

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
#!DATRO 1.0
Primeira linha obrigatória — `1.0` é a versão de especificação atual

metabloco

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
#!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
}
FieldTypeRequiredDescription
titlestringNoTítulo do diagrama legível por humanos
versionstringNoVersão semântica do diagrama
descriptionstringNoDescrição de texto livre
authorstringNoNome do autor ou e-mail
ownerstringNoEquipe ou responsável
tagsstring[]NoTags de classificação arbitrária
slastringNoObjetivo de nível de serviço, por ex. "99.9%"
criticalitystringNoNível de criticidade: "P0" | "high" | "medium" | "low"
kindDiagramKind
"architecture""mindmap""state""sequence""algorithm"
NoVariante 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.

DATRO
# 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" } }
FieldTypeRequiredDescription
ididentifierYesIdentificador de nó exclusivo — alfanumérico + sublinhado
typeNodeType
"service""database""queue""cache""gateway""user""actor""system""external""process""storage""function""broker""scheduler""load_balancer""cdn""dns""firewall""client""mobile""web""iot""unknown"
NoCategoria de nó semântico
labelstringNoExibir texto mostrado no diagrama
groupidentifierNoID do grupo ao qual este nó pertence (alternativa para group.members)
attrsAttrMapNoMetadados 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).

DATRO
# 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 }
FieldTypeRequiredDescription
fromidentifierYesID do nó de origem
directionEdgeDir
"->""<->""--"
YesTipo de seta escrito em linha
toidentifierYesID do nó de destino
kindEdgeKind
"http""grpc""graphql""websocket""tcp""udp""query""event""publish""subscribe""stream""call""read""write""deploys""monitors""depends""extends""implements""triggers""unknown"
NoTipo de relacionamento semântico – impulsiona cor e estilo
labelstringNoTexto curto exibido na linha da borda
weightnumberNoPeso relativo do tráfego – bordas mais pesadas ficam mais espessas
asyncbooleanNoQuando true, a borda é renderizada como tracejada (dispare e esqueça)
attrsAttrMapNoMetadados 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.

DATRO
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
}
FieldTypeRequiredDescription
ididentifierYesIdentificador exclusivo do grupo
labelstringNoExibir rótulo para a caixa de subgráfico
membersidentifier[]NoIDs de nós ou grupos a serem incluídos — tem precedência sobre node { group: X }
attrsAttrMapNoMetadados 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.

DATRO
# 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
}
FieldTypeRequiredDescription
idstringNoIdentificador de regra legível opcional
rulestringYesSUBJECT VERB OBJECT — veja a tabela de verbos abaixo
messagestringNoMensagem personalizada mostrada no diagnóstico quando a regra é violada
severityConstraintSeverity
"error""warn"
NoGravidade do diagnóstico quando violado

Verbos de restrição

  • `!->` — nenhum nó SUBJECT pode ter uma borda direcionada para qualquer nó OBJECT.
  • `->` — cada nó SUBJECT deve ter pelo menos uma aresta direcionada para um nó OBJECT.
  • `!<->` — nenhuma borda bidirecional pode existir entre os nós SUBJECT e OBJECT.
  • `<->` — todo nó SUBJECT deve ter uma borda bidirecional para algum nó OBJECT.
  • `in` — cada nó SUBJECT deve ser membro do grupo OBJECT.
  • `!in` — nenhum nó SUBJECT pode ser membro do grupo OBJECT.
💡

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.

DATRO
# 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]
FieldTypeRequiredDescription
pathstringYesCaminho relativo ou absoluto para o arquivo .dtro
asidentifierNoAlias de namespace — todos os IDs importados têm o prefixo alias.id
exposeidentifier[]NoLista 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.

DATRO
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
}
FieldTypeRequiredDescription
directionLayoutDirection
"LR""RL""TB""BT"
NoDireção do fluxo do gráfico
algoLayoutAlgo
"dagre""dot""elk""force""none"
NoAlgoritmo de layout
node_sepnumberNoPixels mínimos entre nós adjacentes na mesma classificação
rank_sepnumberNoPixels mínimos entre classificações
marginnumberNoMargem do gráfico em pixels
cluster_paddingnumberNoPreenchimento 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.

DATRO
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.

DATRO
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" }
  }
}
FieldTypeRequiredDescription
by_typeRecord<NodeType, StyleProps>NoEstilos aplicados a todos os nós de um determinado tipo
by_idRecord<id, StyleProps>NoEstilos aplicados a um ID de nó específico – prioridade mais alta
by_edge_kindRecord<EdgeKind, StyleProps>NoEstilos aplicados a todas as arestas de um determinado tipo
by_edge_attrRecord<attrName, StyleProps>NoEstilos 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.0 ausente ou malformado
  • `E201` — ID do nó duplicado
  • `E202` — O nó faz referência a um ID de grupo desconhecido
  • `E301` — Nó de borda from não encontrado
  • `E302` — Nó de borda to não encontrado
  • `E303` — A borda weight é negativa
  • `E401` — ID de grupo duplicado
  • `E402` — O grupo members faz 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 severity da 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

Abra o Criador de Diagramas

Experimente o idioma completo ao vivo – cole qualquer trecho acima e valide instantaneamente.

Schema v1 · Updated October 2026