Language Reference
Full syntax — every block, field, and diagnostic code
Riferimento linguistico
Riferimento completo alla sintassi per Datro DSL (file .dtro). Ogni tipo di blocco, ogni campo, ogni codice diagnostico: tutto in un unico posto.
Intestazione magica
Ogni file .dtro deve iniziare con l'intestazione magica alla riga 1. Il parser restituisce E100 se manca o è malformato.
#!DATRO 1.0metablocco
Metadati facoltativi a livello di documento. Produce il suggerimento informativo I003 se omesso. Tutti i campi sono stringhe/array opzionali tranne 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 | — | Titolo del diagramma leggibile dall'uomo |
version | string | No | — | Versione semantica del diagramma |
description | string | No | — | Descrizione a testo libero |
author | string | No | — | Nome o email dell'autore |
owner | string | No | — | Squadra o persona responsabile |
tags | string[] | No | — | Tag di classificazione arbitrari |
sla | string | No | — | Obiettivo del livello di servizio, ad es. "99.9%" |
criticality | string | No | — | Livello di criticità: "P0" | "high" | "medium" | "low" |
kind | DiagramKind "architecture""mindmap""state""sequence""algorithm" | No | architecture | Variante del diagramma |
blocco nodo
Dichiara un'entità nel diagramma. Ogni nodo ha un ID univoco, un type semantico che ne controlla la forma renderizzata e il colore predefinito e un blocco attrs opzionale per i metadati.
# 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 | — | Identificatore univoco del nodo: alfanumerico + carattere di sottolineatura |
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 del nodo semantico |
label | string | No | (node id) | Visualizza il testo mostrato nel diagramma |
group | identifier | No | — | ID gruppo a cui appartiene questo nodo (alternativa a group.members) |
attrs | AttrMap | No | — | Metadati con valori-chiave arbitrari: stringhe, numeri, valori booleani o matrici |
23 tipi di nodo
Tutti i 23 valori: service database queue cache gateway user actor system external process storage function broker scheduler load_balancer cdn dns firewall client mobile web iot unknown.
blocco del bordo
Dichiara una relazione tra due nodi. La direzione del bordo è scritta direttamente nella dichiarazione: -> (diretto), <-> (bidirezionale) o -- (non indirizzato).
# 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 di origine |
direction | EdgeDir "->""<->""--" | Yes | — | Tipo di freccia scritto in linea |
to | identifier | Yes | — | ID del nodo di destinazione |
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 di relazione semantica: guida il colore e lo stile |
label | string | No | — | Breve testo visualizzato sulla linea del bordo |
weight | number | No | 1.0 | Peso relativo del traffico: i bordi più pesanti rendono più spessi |
async | boolean | No | false | Quando true, il bordo viene visualizzato come tratteggiato (spara e dimentica) |
attrs | AttrMap | No | — | Metadati arbitrari: passati a JSON IR e descrizioni comandi |
21 tipi di bordi
Tutti i 21 valori: http grpc graphql websocket tcp udp query event publish subscribe stream call read write deploys monitors depends extends implements triggers unknown.
blocco di gruppo
Raggruppa i nodi correlati in una casella di sottografo etichettata. Un nodo può appartenere al massimo a un gruppo: E403 si attiva in caso di conflitto. I gruppi possono essere nidificati: un ID membro può fare riferimento a un altro ID gruppo.
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 | — | Identificatore univoco del gruppo |
label | string | No | (group id) | Visualizza l'etichetta per la casella del sottografo |
members | identifier[] | No | [] | ID di nodo o gruppo da includere: ha la precedenza su node { group: X } |
attrs | AttrMap | No | — | Metadati arbitrari |
blocco di vincolo
Dichiara una regola architetturale che il validatore valuta rispetto all'IR. Le violazioni producono E501 (o W501 quando severity: warn). Il campo rule utilizza una grammatica concisa a tre token.
# 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 | — | Identificatore di regola facoltativo leggibile dall'uomo |
rule | string | Yes | — | SUBJECT VERB OBJECT — vedere la tabella dei verbi di seguito |
message | string | No | — | Messaggio personalizzato mostrato nella diagnostica quando la regola viene violata |
severity | ConstraintSeverity "error""warn" | No | error | Gravità diagnostica in caso di violazione |
Verbi di vincolo
- `!->` — nessun nodo
SUBJECTpuò avere un arco diretto verso qualsiasi nodoOBJECT. - `->` — ogni nodo
SUBJECTdeve avere almeno un arco diretto verso un nodoOBJECT. - `!<->` — non può esistere alcun bordo bidirezionale tra i nodi
SUBJECTeOBJECT. - `<->` — ogni nodo
SUBJECTdeve avere un bordo bidirezionale verso qualche nodoOBJECT. - `in` — ogni nodo
SUBJECTdeve essere un membro del gruppoOBJECT. - `!in` — nessun nodo
SUBJECTpuò essere membro del gruppoOBJECT.
Segnalini soggetto e oggetto
Ogni token può essere un tipo di nodo (database, external, …), un ID di gruppo (ad esempio data_tier) o * (carattere jolly che corrisponde a ogni nodo).
blocco di importazione
Divide i diagrammi di grandi dimensioni su più file .dtro. Il risolutore unisce l'IR importato nel genitore prima della convalida. Utilizzare as per lo spazio dei nomi e expose per autorizzare ID specifici.
# 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 | — | Percorso relativo o assoluto al file .dtro. |
as | identifier | No | — | Alias dello spazio dei nomi: tutti gli ID importati hanno il prefisso alias.id |
expose | identifier[] | No | — | Whitelist: solo questi ID vengono uniti nell'IR principale |
blocco di layout
Suggerimenti al renderer su come disporre il grafico. Tutti i campi sono facoltativi: il renderer utilizza valori predefiniti ragionevoli quando il blocco viene omesso.
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 | Direzione del flusso nel grafico |
algo | LayoutAlgo "dagre""dot""elk""force""none" | No | dagre | Algoritmo di layout |
node_sep | number | No | 60 | Pixel minimi tra nodi adiacenti nello stesso rango |
rank_sep | number | No | 120 | Pixel minimi tra i ranghi |
margin | number | No | 20 | Margine del grafico in pixel |
cluster_padding | number | No | 16 | Imbottitura extra all'interno dei riquadri di delimitazione del gruppo |
blocco tematico
Controlla l'aspetto visivo del diagramma sottoposto a rendering. Il palette associa i tipi di nodo ai colori esadecimali. Il sottoblocco accessibility abilita il controllo automatico del contrasto 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
}
}Colore carattere automatico
L'esportatore DOT seleziona automaticamente il testo in bianco o nero per ciascun riempimento del nodo utilizzando la formula di luminanza relativa WCAG 2.1. Non è mai necessario impostare un colore di testo separato.
blocco di stile
Sostituzioni dettagliate per elemento applicate dopo il tema. Regole a cascata: by_id sovrascrive by_type. Ogni sottoblocco associa una chiave a una mappa delle proprietà.
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 | — | Stili applicati a tutti i nodi di un determinato tipo |
by_id | Record<id, StyleProps> | No | — | Stili applicati a un ID nodo specifico: priorità più alta |
by_edge_kind | Record<EdgeKind, StyleProps> | No | — | Stili applicati a tutti i bordi di un determinato tipo |
by_edge_attr | Record<attrName, StyleProps> | No | — | Stili applicati ai bordi in cui l'attributo booleano denominato è true |
Codici diagnostici
Tutta la diagnostica include una posizione code, severity, message e una posizione line:col opzionale. La tabella seguente elenca tutti i codici che la toolchain può emettere.
Errori (E×××)
- `E100` — L'intestazione magica
#!DATRO 1.0manca o non è valida - `E201` — ID nodo duplicato
- `E202` — Il nodo fa riferimento a un ID di gruppo sconosciuto
- `E301` — Nodo Edge
fromnon trovato - `E302` — Nodo Edge
tonon trovato - `E303` — Il fronte
weightè negativo - `E401` — ID gruppo duplicato
- `E402` — Il gruppo
membersfa riferimento a un ID sconosciuto - `E403` — Il nodo è assegnato a più di un gruppo
- `E404` — Rilevata nidificazione di gruppi circolari
- `E500` — La regola di vincolo presenta un errore di sintassi
- `E501` — La regola del vincolo è violata (la gravità rispecchia quella del vincolo
severity)
Avvertenze (L×××)
- `W301` — Bordo duplicato (stesso da/a/tipo/etichetta)
- `W501` — La regola di vincolo utilizza un verbo sconosciuto
- `W601` — L'etichetta del nodo supera
max_label_length(predefinito 80 caratteri) - `W602` — Il colore della tavolozza dei temi è inferiore al contrasto WCAG AA (4,5:1)
- `W603` — Il colore della tavolozza dei temi è inferiore al contrasto WCAG AAA (7.0:1)
Suggerimenti informativi (I×××)
- `I001` — Nodo isolato: nessun bordo si collega ad esso
- `I002` — Gruppo vuoto — nessun membro dichiarato
- `I003` — Nessun blocco
meta— consigliato per la documentazione - `I601` — Nessuna tavolozza dei temi definita — controlli del contrasto saltati
Prossimi passi
- Utilizzare CLI Reference per convalidare, formattare ed esportare dalla riga di comando.
- Incorpora i diagrammi in Markdown con il Markdown plugin.
- Torna a Quick Start per una procedura dettagliata.
Prova la lingua completa dal vivo: incolla qualsiasi snippet sopra e convalida immediatamente.