Language Reference
Full syntax — every block, field, and diagnostic code
Sprachreferenz
Vollständige Syntaxreferenz für die Datro DSL-Dateien (.dtro-Dateien). Jeder Blocktyp, jedes Feld, jeder Diagnosecode – alles an einem Ort.
Magischer Header
Jede .dtro-Datei muss mit dem Magic-Header in Zeile 1 beginnen. Der Parser gibt E100 zurück, wenn er fehlt oder fehlerhaft ist.
#!DATRO 1.0Metablock
Optionale Metadaten auf Dokumentebene. Erzeugt einen I003-Infohinweis, wenn er weggelassen wird. Alle Felder außer kind sind optionale Zeichenfolgen/Arrays.
#!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 | — | Für Menschen lesbarer Diagrammtitel |
version | string | No | — | Semantische Version des Diagramms |
description | string | No | — | Freitextbeschreibung |
author | string | No | — | Name oder E-Mail des Autors |
owner | string | No | — | Team oder Verantwortlicher |
tags | string[] | No | — | Beliebige Klassifizierungs-Tags |
sla | string | No | — | Service-Level-Ziel, z.B. "99.9%" |
criticality | string | No | — | Kritikalitätsstufe: "P0" | "high" | "medium" | "low" |
kind | DiagramKind "architecture""mindmap""state""sequence""algorithm" | No | architecture | Diagrammvariante |
Knotenblock
Deklariert eine Entität im Diagramm. Jeder Knoten hat eine eindeutige ID, einen semantischen type, der seine gerenderte Form und Standardfarbe steuert, und einen optionalen attrs-Block für Metadaten.
# 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 | — | Eindeutige Knotenkennung – alphanumerisch + Unterstrich |
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 | Semantische Knotenkategorie |
label | string | No | (node id) | Zeigt den im Diagramm angezeigten Text an |
group | identifier | No | — | Gruppen-ID, zu der dieser Knoten gehört (Alternative zu group.members) |
attrs | AttrMap | No | — | Beliebige Schlüsselwert-Metadaten – Zeichenfolgen, Zahlen, boolesche Werte oder Arrays |
23 Knotentypen
Alle 23 Werte: service database queue cache gateway user actor system external process storage function broker scheduler load_balancer cdn dns firewall client mobile web iot unknown.
Randblock
Deklariert eine Beziehung zwischen zwei Knoten. Die Kantenrichtung wird direkt in die Deklaration geschrieben: -> (gerichtet), <-> (bidirektional) oder -- (ungerichtet).
# 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 | — | Quellknoten-ID |
direction | EdgeDir "->""<->""--" | Yes | — | Inline geschriebener Pfeiltyp |
to | identifier | Yes | — | Zielknoten-ID |
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 | Semantischer Beziehungstyp – bestimmt Farbe und Stil |
label | string | No | — | Kurzer Text, der auf der Randlinie angezeigt wird |
weight | number | No | 1.0 | Relatives Verkehrsgewicht – schwerere Kanten werden dicker |
async | boolean | No | false | Bei true wird die Kante gestrichelt dargestellt (Fire-and-Forget). |
attrs | AttrMap | No | — | Beliebige Metadaten – werden an JSON IR und Tooltips weitergeleitet |
21 Kantenarten
Alle 21 Werte: http grpc graphql websocket tcp udp query event publish subscribe stream call read write deploys monitors depends extends implements triggers unknown.
Gruppenblock
Gruppiert verwandte Knoten in einem beschrifteten Unterdiagrammfeld. Ein Knoten darf höchstens einer Gruppe angehören – E403 wird bei Konflikten ausgelöst. Gruppen können verschachtelt sein: Eine Mitglieds-ID kann auf eine andere Gruppen-ID verweisen.
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 | — | Eindeutiger Gruppenbezeichner |
label | string | No | (group id) | Anzeigebeschriftung für das Unterdiagrammfeld |
members | identifier[] | No | [] | Einzuschließende Knoten- oder Gruppen-IDs – haben Vorrang vor node { group: X } |
attrs | AttrMap | No | — | Beliebige Metadaten |
Einschränkungsblock
Deklariert eine Architekturregel, die der Validator anhand der IR auswertet. Verstöße erzeugen E501 (oder W501, wenn severity: warn). Das Feld rule verwendet eine prägnante Drei-Token-Grammatik.
# 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 | — | Optionaler, für Menschen lesbarer Regelbezeichner |
rule | string | Yes | — | SUBJECT VERB OBJECT – siehe Verbtabelle unten |
message | string | No | — | Benutzerdefinierte Meldung, die in der Diagnose angezeigt wird, wenn gegen die Regel verstoßen wird |
severity | ConstraintSeverity "error""warn" | No | error | Diagnoseschweregrad bei Verstoß |
Einschränkungsverben
- `!->` – kein
SUBJECT-Knoten darf eine gerichtete Kante zu einem beliebigenOBJECT-Knoten haben. - `->` – jeder
SUBJECT-Knoten muss mindestens eine gerichtete Kante zu einemOBJECT-Knoten haben. - `!<->` – zwischen den Knoten
SUBJECTundOBJECTdarf keine bidirektionale Kante vorhanden sein. - `<->` – jeder
SUBJECT-Knoten muss eine bidirektionale Kante zu einemOBJECT-Knoten haben. - `in` – jeder
SUBJECT-Knoten muss Mitglied der GruppeOBJECTsein. - `!in` – kein
SUBJECT-Knoten darf Mitglied der GruppeOBJECTsein.
Subjekt- und Objekt-Token
Jedes Token kann ein Knotentyp (database, external, …), eine Gruppen-ID (z. B. data_tier) oder * (Platzhalter für jeden Knoten) sein.
Block importieren
Teilt große Diagramme auf mehrere .dtro-Dateien auf. Der Resolver führt die importierte IR vor der Validierung mit der übergeordneten IR zusammen. Verwenden Sie as für den Namensraum und expose, um bestimmte IDs auf die Whitelist zu setzen.
# 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 | — | Relativer oder absoluter Pfad zur Datei .dtro. |
as | identifier | No | — | Namespace-Alias – allen importierten IDs wird alias.id vorangestellt. |
expose | identifier[] | No | — | Whitelist – nur diese IDs werden in die übergeordnete IR zusammengeführt |
Layoutblock
Hinweise für den Renderer zur Anordnung des Diagramms. Alle Felder sind optional – der Renderer verwendet sinnvolle Standardwerte, wenn der Block weggelassen wird.
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 | Flussrichtung grafisch darstellen |
algo | LayoutAlgo "dagre""dot""elk""force""none" | No | dagre | Layout-Algorithmus |
node_sep | number | No | 60 | Mindestpixel zwischen benachbarten Knoten im gleichen Rang |
rank_sep | number | No | 120 | Mindestpixel zwischen den Rängen |
margin | number | No | 20 | Diagrammrand in Pixel |
cluster_padding | number | No | 16 | Zusätzlicher Abstand innerhalb der Gruppenbegrenzungsrahmen |
Themenblock
Steuert das visuelle Erscheinungsbild des gerenderten Diagramms. Der palette ordnet Knotentypen Hex-Farben zu. Der Unterblock accessibility ermöglicht die automatische WCAG 2.1-Kontrastprüfung.
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
}
}Automatische Schriftfarbe
Der DOT-Exporter wählt automatisch schwarzen oder weißen Text für jede Knotenfüllung aus, indem er die relative Luminanzformel von WCAG 2.1 verwendet. Sie müssen nie eine separate Textfarbe festlegen.
Stilblock
Fein abgestufte Überschreibungen pro Element, die nach dem Thema angewendet werden. Regelkaskade: by_id überschreibt by_type. Jeder Unterblock ordnet einen Schlüssel einer Eigenschaftszuordnung zu.
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 | — | Auf alle Knoten eines bestimmten Typs angewendete Stile |
by_id | Record<id, StyleProps> | No | — | Auf eine bestimmte Knoten-ID angewendete Stile – höchste Priorität |
by_edge_kind | Record<EdgeKind, StyleProps> | No | — | Stile, die auf alle Kanten einer bestimmten Art angewendet werden |
by_edge_attr | Record<attrName, StyleProps> | No | — | Auf Kanten angewendete Stile, bei denen das benannte boolesche Attribut true ist |
Diagnosecodes
Alle Diagnosen umfassen einen code, severity, message und einen optionalen line:col-Standort. In der folgenden Tabelle ist jeder Code aufgeführt, den die Toolchain ausgeben kann.
Fehler (E×××)
- `E100` – Der Magic-Header
#!DATRO 1.0fehlt oder ist fehlerhaft - `E201` – Doppelte Knoten-ID
- `E202` – Knoten verweist auf eine unbekannte Gruppen-ID
- `E301` – Edge-Knoten
fromnicht gefunden - `E302` – Edge-Knoten
tonicht gefunden - `E303` – Kante
weightist negativ - `E401` – Doppelte Gruppen-ID
- `E402` – Gruppe
membersverweist auf eine unbekannte ID - `E403` – Knoten ist mehr als einer Gruppe zugewiesen
- `E404` – Verschachtelung kreisförmiger Gruppen erkannt
- `E500` – Einschränkungsregel weist einen Syntaxfehler auf
- `E501` – Einschränkungsregel wird verletzt (Schweregrad spiegelt den eigenen
severityder Einschränkung wider)
Warnungen (B×××)
- `W301` – Kante duplizieren (gleich von/bis/art/beschriftung)
- `W501` – Einschränkungsregel verwendet ein unbekanntes Verb
- `W601` – Knotenbezeichnung überschreitet
max_label_length(Standard 80 Zeichen) - `W602` – Die Farbe der Themenpalette liegt unter dem WCAG AA-Kontrast (4,5:1)
- `W603` – Die Farbe der Themenpalette liegt unter dem WCAG AAA-Kontrast (7,0:1)
Info-Hinweise (I×××)
- `I001` – Isolierter Knoten – keine Kanten sind mit ihm verbunden
- `I002` – Leere Gruppe – keine Mitglieder deklariert
- `I003` – Kein
meta-Block – für Dokumentation empfohlen - `I601` – Keine Themenpalette definiert – Kontrastprüfungen übersprungen
Nächste Schritte
- Verwenden Sie CLI Reference zum Validieren, Formatieren und Exportieren über die Befehlszeile.
- Betten Sie Diagramme in Markdown mit dem Markdown plugin ein.
- Gehen Sie zurück zu Quick Start für eine Schritt-für-Schritt-Anleitung.
Probieren Sie die vollständige Sprache live aus – fügen Sie einen beliebigen Snippet oben ein und validieren Sie ihn sofort.