Language Reference
Full syntax — every block, field, and diagnostic code
Referencia de idioma
Referencia de sintaxis completa para Datro DSL (archivos .dtro. Cada tipo de bloque, cada campo, cada código de diagnóstico, todo en un solo lugar.
Cabecera mágica
Cada archivo .dtro debe comenzar con el encabezado mágico en la línea 1. El analizador devuelve E100 si falta o tiene un formato incorrecto.
#!DATRO 1.0metabloque
Metadatos opcionales a nivel de documento. Produce I003 sugerencia de información si se omite. Todos los campos son cadenas/matrices opcionales excepto 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 del diagrama legible por humanos |
version | string | No | — | Versión semántica del diagrama. |
description | string | No | — | Descripción en texto libre |
author | string | No | — | Nombre del autor o correo electrónico |
owner | string | No | — | Equipo o persona responsable |
tags | string[] | No | — | Etiquetas de clasificación arbitrarias |
sla | string | No | — | Objetivo de nivel de servicio, p.e. "99.9%" |
criticality | string | No | — | Nivel de criticidad: "P0" | "high" | "medium" | "low" |
kind | DiagramKind "architecture""mindmap""state""sequence""algorithm" | No | architecture | Variante del diagrama |
bloque de nodos
Declara una entidad en el diagrama. Cada nodo tiene una identificación única, un type semántico que controla su forma representada y su color predeterminado, y un bloque attrs opcional para metadatos.
# 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 nodo único: alfanumérico + guión bajo |
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 | Categoría de nodo semántico |
label | string | No | (node id) | Mostrar texto que se muestra en el diagrama. |
group | identifier | No | — | ID de grupo al que pertenece este nodo (alternativa a group.members) |
attrs | AttrMap | No | — | Metadatos de valores-clave arbitrarios: cadenas, números, valores booleanos o matrices |
23 tipos de nodos
Los 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.
bloque de borde
Declara una relación entre dos nodos. La dirección del borde se escribe directamente en la declaración: -> (dirigida), <-> (bidireccional) o -- (no dirigida).
# 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 del nodo de origen |
direction | EdgeDir "->""<->""--" | Yes | — | Tipo de flecha escrito en línea |
to | identifier | Yes | — | ID del nodo 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 relación semántica: impulsa el color y el estilo |
label | string | No | — | Texto breve mostrado en la línea del borde. |
weight | number | No | 1.0 | Peso relativo del tráfico: los bordes más pesados se vuelven más gruesos |
async | boolean | No | false | Cuando true, el borde se muestra como discontinuo (dispara y olvida) |
attrs | AttrMap | No | — | Metadatos arbitrarios: pasados a JSON IR e información sobre herramientas |
21 tipos de bordes
Los 21 valores: http grpc graphql websocket tcp udp query event publish subscribe stream call read write deploys monitors depends extends implements triggers unknown.
bloque de grupo
Agrupa nodos relacionados en un cuadro de subgrafo etiquetado. Un nodo puede pertenecer como máximo a un grupo: E403 activa los conflictos. Los grupos se pueden anidar: una identificación de miembro puede hacer referencia a otra identificación 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 de grupo único |
label | string | No | (group id) | Mostrar etiqueta para el cuadro de subgrafo |
members | identifier[] | No | [] | ID de nodo o grupo a incluir: tiene prioridad sobre node { group: X } |
attrs | AttrMap | No | — | Metadatos arbitrarios |
bloque de restricción
Declara una regla arquitectónica que el validador evalúa con respecto al IR. Las violaciones producen E501 (o W501 cuando severity: warn). El campo rule utiliza una gramática concisa de tres 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 regla legible por humanos opcional |
rule | string | Yes | — | SUBJECT VERB OBJECT — ver la tabla de verbos a continuación |
message | string | No | — | Mensaje personalizado que se muestra en el diagnóstico cuando se infringe la regla |
severity | ConstraintSeverity "error""warn" | No | error | Gravedad diagnóstica cuando se viola. |
Verbos de restricción
- `!->` — ningún nodo
SUBJECTpuede tener un borde dirigido a cualquier nodoOBJECT. - `->`: cada nodo
SUBJECTdebe tener al menos un borde dirigido a un nodoOBJECT. - `!<->`: no puede existir ningún borde bidireccional entre los nodos
SUBJECTyOBJECT. - `<->`: cada nodo
SUBJECTdebe tener un borde bidireccional hacia algún nodoOBJECT. - `in`: cada nodo
SUBJECTdebe ser miembro del grupoOBJECT. - `!in` — ningún nodo
SUBJECTpuede ser miembro del grupoOBJECT.
Fichas de sujeto y objeto
Cada token puede ser un tipo de nodo (database, external, …), un ID de grupo (por ejemplo, data_tier) o * (comodín que coincide con cada nodo).
bloque de importación
Divide diagramas grandes en múltiples archivos .dtro. El solucionador fusiona el IR importado con el principal antes de la validación. Utilice as para el espacio de nombres y expose para incluir en la lista blanca identificadores específicos.
# 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 | — | Ruta relativa o absoluta al archivo .dtro |
as | identifier | No | — | Alias de espacio de nombres: todos los identificadores importados tienen el prefijo alias.id |
expose | identifier[] | No | — | Lista blanca: solo estos identificadores se fusionan en el IR principal |
bloque de diseño
Consejos para el renderizador sobre cómo organizar el gráfico. Todos los campos son opcionales: el renderizador utiliza valores predeterminados sensatos cuando se omite el bloque.
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 | Dirección del flujo del gráfico |
algo | LayoutAlgo "dagre""dot""elk""force""none" | No | dagre | Algoritmo de diseño |
node_sep | number | No | 60 | Píxeles mínimos entre nodos adyacentes en el mismo rango |
rank_sep | number | No | 120 | Píxeles mínimos entre rangos |
margin | number | No | 20 | Margen del gráfico en píxeles |
cluster_padding | number | No | 16 | Relleno adicional dentro de los cuadros delimitadores del grupo |
bloque temático
Controla la apariencia visual del diagrama renderizado. El palette asigna tipos de nodos a colores hexadecimales. El subbloque accessibility permite la comprobación automática del 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
}
}Color de fuente automático
El exportador DOT selecciona automáticamente texto blanco o negro para cada relleno de nodo utilizando la fórmula de luminancia relativa WCAG 2.1. Nunca necesitarás establecer un color de texto separado.
bloque de estilo
Anulaciones detalladas por elemento aplicadas después del tema. Cascada de reglas: by_id anula by_type. Cada subbloque asigna una clave a un mapa de propiedades.
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 los nodos de un tipo determinado. |
by_id | Record<id, StyleProps> | No | — | Estilos aplicados a una identificación de nodo específica: máxima prioridad |
by_edge_kind | Record<EdgeKind, StyleProps> | No | — | Estilos aplicados a todos los bordes de un tipo determinado. |
by_edge_attr | Record<attrName, StyleProps> | No | — | Estilos aplicados a bordes donde el atributo booleano nombrado es true |
Códigos de diagnóstico
Todos los diagnósticos incluyen una ubicación code, severity, message y una ubicación opcional line:col. La siguiente tabla enumera todos los códigos que la cadena de herramientas puede emitir.
Errores (E×××)
- `E100` — Falta el encabezado mágico
#!DATRO 1.0o está mal formado - `E201` — ID de nodo duplicado
- `E202` — El nodo hace referencia a una identificación de grupo desconocida
- `E301` — Nodo de borde
fromno encontrado - `E302` — Nodo de borde
tono encontrado - `E303` — El borde
weightes negativo - `E401` — ID de grupo duplicado
- `E402` — El grupo
membershace referencia a una identificación desconocida - `E403` — El nodo está asignado a más de un grupo
- `E404` — Se detectó anidamiento de grupo circular
- `E500` — La regla de restricción tiene un error de sintaxis
- `E501` — Se infringe la regla de restricción (la gravedad refleja la propia
severityde la restricción)
Advertencias (W×××)
- `W301` — Borde duplicado (mismo desde/hasta/tipo/etiqueta)
- `W501` — La regla de restricción utiliza un verbo desconocido
- `W601` — La etiqueta del nodo excede
max_label_length(80 caracteres predeterminados) - `W602` — El color de la paleta del tema cae por debajo del contraste WCAG AA (4.5:1)
- `W603` — El color de la paleta del tema cae por debajo del contraste WCAG AAA (7.0:1)
Consejos informativos (I×××)
- `I001` — Nodo aislado — no hay bordes conectados a él
- `I002` — Grupo vacío — no hay miembros declarados
- `I003` — Sin bloque
meta— recomendado para documentación - `I601` — No hay paleta de temas definida — se omitieron las comprobaciones de contraste
Próximos pasos
- Utilice CLI Reference para validar, formatear y exportar desde la línea de comando.
- Incruste diagramas en Markdown con Markdown plugin.
- Vuelva a Quick Start para ver un tutorial paso a paso.
Pruebe el idioma completo en vivo: pegue cualquier fragmento de arriba y valídelo al instante.