Language Reference
Full syntax — every block, field, and diagnostic code
Taalreferentie
Volledige syntaxisreferentie voor Datro DSL-bestanden (.dtro-Dossiers). Elk bloktype, elk veld, elke diagnosecode alles op één plek.
Magische koppen
Ieder .dtro-File moet beginnen met de Magic Header in lijn 1. De parser geeft E100 terug te brengen als het ontbreekt of fout is.
#!DATRO 1.0Metablokken
Optioneel metadata op documentniveau. Geproduceert I003-Informatie wanneer deze wordt weggelaten. Alle velden behalve kind zijn optieve tekens/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 | — | Mensenleesbare grafiek titels |
version | string | No | — | Semantische versie van de grafiek |
description | string | No | — | Vrije tekstbeschrijving |
author | string | No | — | Naam of e-mail van de auteur |
owner | string | No | — | Team of verantwoordelijke |
tags | string[] | No | — | Aanvaardbare classificatiedagen |
sla | string | No | — | Dienstniveau-Ziel, z.B. "99.9%" |
criticality | string | No | — | Graad van kritiek: "P0" | "high" | "medium" | "low" |
kind | DiagramKind "architecture""mindmap""state""sequence""algorithm" | No | architecture | Grafiekvariant |
Knotblokken
Vermeld een entiteit in het schema. Elke knoop heeft een unieke ID, een semantieke type, die zijn aangepaste vorm en standaardkleur regelt, en een optionele attrs-Metadata-blok.
# 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 | — | Eenvoudige knopkenmerking alphanumerisch + onderstreep |
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 nodenklasse |
label | string | No | (node id) | Toon de tekst die in het diagram wordt weergegeven |
group | identifier | No | — | Groeps-ID van deze knooppunt (alternatief voor group.members) |
attrs | AttrMap | No | — | Metadata met willekeurige sleutelwaarden tekenreeks, cijfers, boole waarden of arrays |
23 Knottypen
Alle 23 waarden: 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
Verklart een relatie tussen twee knopen. De kantrichting wordt rechtstreeks in de verklaring geschreven: -> (georiënteerd), <-> (bijrichting) of -- (Niet geregeld).
# 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 | — | Source node-ID |
direction | EdgeDir "->""<->""--" | Yes | — | Pfeiltyp met in-line teksten |
to | identifier | Yes | — | Doelknop-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 | Semantisch relatietype bepaalt kleur en stijl |
label | string | No | — | Korte tekst die wordt weergegeven op de randlijn |
weight | number | No | 1.0 | Relatief verkeersgewicht zwaarder kanten worden dikker |
async | boolean | No | false | Bij true de rand is gestript (fire-and-forget)). |
attrs | AttrMap | No | — | Gewenst metadata wordt doorgestuurd naar JSON IR en tooltips |
21 Buitensoorten
Alle 21 waarden: http grpc graphql websocket tcp udp query event publish subscribe stream call read write deploys monitors depends extends implements triggers unknown.
Groepblok
Groepeerde verwante nodes in een aangegeven subdiagramveld. Een knop mag niet meer dan één groep behoren – E403 wordt veroorzaakt bij conflicten. Groepen kunnen gesloten zijn: een lid-ID kan naar een andere groep-ID verwijzen.
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 | — | Eenvoudige groepsbenamers |
label | string | No | (group id) | Indicatie voor het subdiagramveld |
members | identifier[] | No | [] | Inkluderende knop- of groeps-ID's hebben voorrang node { group: X } |
attrs | AttrMap | No | — | Gewenst metadata |
Beperkingspakket
Verklart een architectuurregel die de validator op basis van de IR beoordeelt. Inbreuken veroorzaken E501 (of W501, Wanneer severity: warn). Het veld rule gebruikt een scherpe drie-token grammatika.
# 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 | — | Optionele, voor mensen leesbare regelnummers |
rule | string | Yes | — | SUBJECT VERB OBJECT – Zie onderstaande tabel |
message | string | No | — | Gebruikersgemaakte melding die wordt weergegeven in de diagnose wanneer de regel wordt overtreden |
severity | ConstraintSeverity "error""warn" | No | error | Graad van diagnose bij inbreuk |
Beperkingseisen
- `!->` – geen
SUBJECT-Een knop mag een gericht rand hebben op een of andereOBJECT-Knotten. - `->` – elk
SUBJECT-Een knop moet ten minste een gericht rand hebben aan eenOBJECT-Knotten. - `!<->` – tussen de knopen
SUBJECTenOBJECTEr mag geen tweerichtingsrand zijn. - `<->` – elk
SUBJECT-Een knop moet een tweedirectionele rand hebben aan eenOBJECT-Knotten. - `in` – elk
SUBJECT-Knoten moet lid zijn van de groepOBJECTzijn. - `!in` – geen
SUBJECT-Knoten mag lid zijn van de groepOBJECTzijn.
Onderwerp- en objecttokens
Elk token kan een knoptype hebben (`database`, `external`, …), een groep-ID (z. B. data_tier) of * (De plaatshouder voor elke knop).
Block importeren
Verdeel grote grafieken in meerdere .dtro-Files op. De resolver brengt de ingevoerde IR voor validatie samen met de hogere IR. Gebruik as voor de naamruimte en expose, om bepaalde ID's op de witte lijst te plaatsen.
# 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 | — | Relatief of absoluut pad naar de file .dtro. |
as | identifier | No | — | Namespace alias alle ingevoerde ID's wordt alias.id Vooraf aangesteld. |
expose | identifier[] | No | — | Whitelist alleen deze ID's worden samengevoegd in de overige IR |
Layoutblok
Aanwijzingen voor de weergever om het diagram te plaatsen. Alle velden zijn optioneel de renderer gebruikt zinvolle standaard waarden wanneer het blok wordt weggelaten.
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 | Grafiek maken van de rivierrichting |
algo | LayoutAlgo "dagre""dot""elk""force""none" | No | dagre | Layout-algoritme |
node_sep | number | No | 60 | Minimaal pixel tussen naburige knopen van dezelfde rang |
rank_sep | number | No | 120 | Minimaal pixel tussen de rangen |
margin | number | No | 20 | Grafiek in pixels |
cluster_padding | number | No | 16 | Aanvullende afstand binnen de groepsbeperingsraam |
Onderwerpblok
Beheer de visuele verschijning van het aangepaste diagram. De palette schrijft hex-kleuren voor knottypen. Het onderblok accessibility maakt de automatische WCAG 2.1 contrastcontrole mogelijk.
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 schriftelijke kleur
De DOT-exporteur selecteert automatisch zwarte of witte tekst voor elke knopvelling met behulp van de relatieve luminantieformule van WCAG 2.1. Je hoeft nooit een afzonderlijke tekstkleur vast te stellen.
Stilblok
Fein gegradeerde overschrijvingen per element, toegepast op het onderwerp. Regelscascade: by_id overschrijft by_type. Elk subblok geeft een sleutel tot een attributie toe.
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 | — | Stijlen die op alle knopen van een bepaald type worden toegepast |
by_id | Record<id, StyleProps> | No | — | Stijlen toegepast op een bepaalde knop-ID hoogste prioriteit |
by_edge_kind | Record<EdgeKind, StyleProps> | No | — | Stijlen die aan alle kanten van een bepaald type worden toegepast |
by_edge_attr | Record<attrName, StyleProps> | No | — | Stijlen die aan de rand worden toegepast waarbij het benoemde boolese attribuut true is |
Diagnosecodes
Alle diagnoses omvatten een code, severity, message en een optionele line:col-Locatie. De volgende tabel bevat elke code die de toolchain kan uitbrengen.
Fouten (E)×××)
- `E100` – Der Magic-Header
#!DATRO 1.0ontbreekt of fout is - `E201` – Dubbelknop-ID
- `E202` – Knoten verwijst naar een onbekende groeps-ID
- `E301` – Randenknoppen
fromniet gevonden - `E302` – Randenknoppen
toniet gevonden - `E303` – Kanten
weightis negatief - `E401` – Dubbele groeps-ID
- `E402` – Groep
membersverwijst naar een onbekende ID - `E403` – Een knooppunt is toegewezen aan meer dan één groep
- `E404` – Geïdentificeerd verzameling van cirkelvormige groepen
- `E500` – De beperkende regel bevat een syntaxisfout
- `E501` – De beperking wordt overtreden (gewicht weerspiegelt de eigen
severityde beperking te weerstaan)
Waarschuwingen (B)×××)
- `W301` – Rand dupliceren (gelijk aan / tot / soort / aanduiding))
- `W501` – De beperkende regel gebruikt een onbekend werkwoord
- `W601` – Overschrijding van de noden
max_label_length(Standard 80 tekens) - `W602` – De kleur van het themapalet ligt onder het WCAG AA-contrast. (4,5:1)
- `W603` – De kleur van het themapalet ligt onder het WCAG AAA-contrast. (7,0:1)
Informatie (I)×××)
- `I001` – Geïsoleerde knopen geen grenzen verbonden
- `I002` – Vluchtige groep geen leden verklaard
- `I003` – Geen enkele
meta-Block voor documentatie aanbevolen - `I601` – Geen thema-palet gedefinieerd contrastcontroles overgeslagen
Volgende stappen
- Gebruik CLI Reference voor het valideren, formateren en exporteren via de command-line.
- Plaats diagrammen in Markdown met de [Markdown plugin](/docs/datro-markdown.
- Ga terug naar Quick Start voor een stapsgewijze handleiding.
Probeer de volledige taal live uit voeg een snippet boven toe en valideer het onmiddellijk.