Diagram Maker›Language Reference
📐

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.

23 tipi di nodo21 tipi di bordi6 verbi di costrizioneWCAG 2.1 AA/AAA

Intestazione magica

Ogni file .dtro deve iniziare con l'intestazione magica alla riga 1. Il parser restituisce E100 se manca o è malformato.

DATRO
#!DATRO 1.0
Prima riga obbligatoria: `1.0` è la versione delle specifiche correnti

metablocco

Metadati facoltativi a livello di documento. Produce il suggerimento informativo I003 se omesso. Tutti i campi sono stringhe/array opzionali tranne 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
titlestringNoTitolo del diagramma leggibile dall'uomo
versionstringNoVersione semantica del diagramma
descriptionstringNoDescrizione a testo libero
authorstringNoNome o email dell'autore
ownerstringNoSquadra o persona responsabile
tagsstring[]NoTag di classificazione arbitrari
slastringNoObiettivo del livello di servizio, ad es. "99.9%"
criticalitystringNoLivello di criticità: "P0" | "high" | "medium" | "low"
kindDiagramKind
"architecture""mindmap""state""sequence""algorithm"
NoVariante 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.

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
ididentifierYesIdentificatore univoco del nodo: alfanumerico + carattere di sottolineatura
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 del nodo semantico
labelstringNoVisualizza il testo mostrato nel diagramma
groupidentifierNoID gruppo a cui appartiene questo nodo (alternativa a group.members)
attrsAttrMapNoMetadati 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).

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 del nodo di origine
directionEdgeDir
"->""<->""--"
YesTipo di freccia scritto in linea
toidentifierYesID del nodo di destinazione
kindEdgeKind
"http""grpc""graphql""websocket""tcp""udp""query""event""publish""subscribe""stream""call""read""write""deploys""monitors""depends""extends""implements""triggers""unknown"
NoTipo di relazione semantica: guida il colore e lo stile
labelstringNoBreve testo visualizzato sulla linea del bordo
weightnumberNoPeso relativo del traffico: i bordi più pesanti rendono più spessi
asyncbooleanNoQuando true, il bordo viene visualizzato come tratteggiato (spara e dimentica)
attrsAttrMapNoMetadati 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.

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
ididentifierYesIdentificatore univoco del gruppo
labelstringNoVisualizza l'etichetta per la casella del sottografo
membersidentifier[]NoID di nodo o gruppo da includere: ha la precedenza su node { group: X }
attrsAttrMapNoMetadati 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.

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
idstringNoIdentificatore di regola facoltativo leggibile dall'uomo
rulestringYesSUBJECT VERB OBJECT — vedere la tabella dei verbi di seguito
messagestringNoMessaggio personalizzato mostrato nella diagnostica quando la regola viene violata
severityConstraintSeverity
"error""warn"
NoGravità diagnostica in caso di violazione

Verbi di vincolo

  • `!->` — nessun nodo SUBJECT può avere un arco diretto verso qualsiasi nodo OBJECT.
  • `->` — ogni nodo SUBJECT deve avere almeno un arco diretto verso un nodo OBJECT.
  • `!<->` — non può esistere alcun bordo bidirezionale tra i nodi SUBJECT e OBJECT.
  • `<->` — ogni nodo SUBJECT deve avere un bordo bidirezionale verso qualche nodo OBJECT.
  • `in` — ogni nodo SUBJECT deve essere un membro del gruppo OBJECT.
  • `!in` — nessun nodo SUBJECT può essere membro del gruppo OBJECT.
💡

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.

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
pathstringYesPercorso relativo o assoluto al file .dtro.
asidentifierNoAlias dello spazio dei nomi: tutti gli ID importati hanno il prefisso alias.id
exposeidentifier[]NoWhitelist: 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.

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"
NoDirezione del flusso nel grafico
algoLayoutAlgo
"dagre""dot""elk""force""none"
NoAlgoritmo di layout
node_sepnumberNoPixel minimi tra nodi adiacenti nello stesso rango
rank_sepnumberNoPixel minimi tra i ranghi
marginnumberNoMargine del grafico in pixel
cluster_paddingnumberNoImbottitura 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.

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
  }
}
💡

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

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>NoStili applicati a tutti i nodi di un determinato tipo
by_idRecord<id, StyleProps>NoStili applicati a un ID nodo specifico: priorità più alta
by_edge_kindRecord<EdgeKind, StyleProps>NoStili applicati a tutti i bordi di un determinato tipo
by_edge_attrRecord<attrName, StyleProps>NoStili 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.0 manca o non è valida
  • `E201` — ID nodo duplicato
  • `E202` — Il nodo fa riferimento a un ID di gruppo sconosciuto
  • `E301` — Nodo Edge from non trovato
  • `E302` — Nodo Edge to non trovato
  • `E303` — Il fronte weight è negativo
  • `E401` — ID gruppo duplicato
  • `E402` — Il gruppo members fa 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.
Apri Creatore di diagrammi

Prova la lingua completa dal vivo: incolla qualsiasi snippet sopra e convalida immediatamente.

Schema v1 · Updated October 2026