Language Reference
Full syntax — every block, field, and diagnostic code
Référence linguistique
Référence de syntaxe complète pour le Datro DSL (fichiers .dtro). Chaque type de bloc, chaque champ, chaque code de diagnostic, le tout au même endroit.
En-tête magique
Chaque fichier .dtro doit commencer par l'en-tête magique de la ligne 1. L'analyseur renvoie E100 s'il est manquant ou mal formé.
#!DATRO 1.0métabloc
Métadonnées facultatives au niveau du document. Produit un indice d'information I003 en cas d'omission. Tous les champs sont des chaînes/tableaux facultatifs, sauf 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 | — | Titre du diagramme lisible par l'homme |
version | string | No | — | Version sémantique du diagramme |
description | string | No | — | Description en texte libre |
author | string | No | — | Nom de l'auteur ou email |
owner | string | No | — | Équipe ou personne responsable |
tags | string[] | No | — | Balises de classification arbitraires |
sla | string | No | — | Objectif de niveau de service, par ex. "99.9%" |
criticality | string | No | — | Niveau de criticité : "P0" | "high" | "medium" | "low" |
kind | DiagramKind "architecture""mindmap""state""sequence""algorithm" | No | architecture | Variante de diagramme |
bloc de nœud
Déclare une entité dans le diagramme. Chaque nœud a un identifiant unique, un type sémantique qui contrôle sa forme rendue et sa couleur par défaut, et un bloc attrs facultatif pour les métadonnées.
# 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 | — | Identificateur de nœud unique : alphanumérique + trait de soulignement |
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 | Catégorie de nœud sémantique |
label | string | No | (node id) | Afficher le texte affiché dans le diagramme |
group | identifier | No | — | ID de groupe auquel ce nœud appartient (alternative à group.members) |
attrs | AttrMap | No | — | Métadonnées clé-valeur arbitraires : chaînes, nombres, booléens ou tableaux |
23 types de nœuds
Les 23 valeurs : service database queue cache gateway user actor system external process storage function broker scheduler load_balancer cdn dns firewall client mobile web iot unknown.
bloc de bord
Déclare une relation entre deux nœuds. La direction du bord est écrite directement dans la déclaration : -> (dirigé), <-> (bidirectionnel) ou -- (non orienté).
# 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 du nœud source |
direction | EdgeDir "->""<->""--" | Yes | — | Type de flèche écrit en ligne |
to | identifier | Yes | — | ID du nœud cible |
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 | Type de relation sémantique : détermine la couleur et le style |
label | string | No | — | Texte court affiché sur la ligne de bord |
weight | number | No | 1.0 | Poids du trafic relatif — les bords plus lourds rendent plus épais |
async | boolean | No | false | Lorsque true, le bord s'affiche en pointillés (tirer et oublier) |
attrs | AttrMap | No | — | Métadonnées arbitraires – transmises à JSON IR et aux info-bulles |
21 types de bords
Les 21 valeurs : http grpc graphql websocket tcp udp query event publish subscribe stream call read write deploys monitors depends extends implements triggers unknown.
bloc de groupe
Regroupe les nœuds associés dans une boîte de sous-graphique étiquetée. Un nœud peut appartenir à au plus un groupe — E403 se déclenche en cas de conflits. Les groupes peuvent être imbriqués : un identifiant de membre peut faire référence à un autre identifiant de groupe.
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 | — | Identifiant unique du groupe |
label | string | No | (group id) | Étiquette d'affichage pour la boîte de sous-graphique |
members | identifier[] | No | [] | ID de nœud ou de groupe à inclure – est prioritaire sur node { group: X } |
attrs | AttrMap | No | — | Métadonnées arbitraires |
bloc de contrainte
Déclare une règle architecturale que le validateur évalue par rapport à l'IR. Les violations produisent E501 (ou W501 lorsque severity: warn). Le champ rule utilise une grammaire concise à trois jetons.
# 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 | — | Identificateur de règle lisible par l'homme facultatif |
rule | string | Yes | — | SUBJECT VERB OBJECT — voir le tableau des verbes ci-dessous |
message | string | No | — | Message personnalisé affiché dans les diagnostics lorsque la règle est violée |
severity | ConstraintSeverity "error""warn" | No | error | Gravité du diagnostic en cas de violation |
Verbes de contrainte
- `!->` — aucun nœud
SUBJECTne peut avoir un bord dirigé vers un nœudOBJECT. - `->` — chaque nœud
SUBJECTdoit avoir au moins un bord dirigé vers un nœudOBJECT. - `!<->` — aucun bord bidirectionnel ne peut exister entre les nœuds
SUBJECTetOBJECT. - `<->` — chaque nœud
SUBJECTdoit avoir un bord bidirectionnel vers un nœudOBJECT. - `in` — chaque nœud
SUBJECTdoit être membre du groupeOBJECT. - `!in` — aucun nœud
SUBJECTne peut être membre du groupeOBJECT.
Jetons de sujet et d'objet
Chaque jeton peut être un type de nœud (database, external, …), un identifiant de groupe (par exemple data_tier) ou * (caractère générique correspondant à chaque nœud).
bloc d'importation
Divise les grands diagrammes sur plusieurs fichiers .dtro. Le résolveur fusionne l'IR importé dans le parent avant la validation. Utilisez as pour l'espacement des noms et expose pour ajouter des identifiants spécifiques à la liste blanche.
# 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 | — | Chemin relatif ou absolu vers le fichier .dtro |
as | identifier | No | — | Alias d'espace de noms – tous les identifiants importés portent le préfixe alias.id |
expose | identifier[] | No | — | Liste blanche : seuls ces identifiants sont fusionnés dans l'IR parent |
bloc de mise en page
Conseils au moteur de rendu sur la manière d'organiser le graphique. Tous les champs sont facultatifs — le moteur de rendu utilise des valeurs par défaut raisonnables lorsque le bloc est omis.
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 | Direction du flux graphique |
algo | LayoutAlgo "dagre""dot""elk""force""none" | No | dagre | Algorithme de mise en page |
node_sep | number | No | 60 | Pixels minimum entre les nœuds adjacents du même rang |
rank_sep | number | No | 120 | Pixels minimum entre les rangs |
margin | number | No | 20 | Marge du graphique en pixels |
cluster_padding | number | No | 16 | Rembourrage supplémentaire à l'intérieur des boîtes englobantes de groupe |
bloc thématique
Contrôle l’apparence visuelle du diagramme rendu. Le palette mappe les types de nœuds aux couleurs hexadécimales. Le sous-bloc accessibility permet la vérification automatique du 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
}
}Couleur de police automatique
L'exportateur DOT sélectionne automatiquement le texte en noir ou blanc pour chaque remplissage de nœud à l'aide de la formule de luminance relative WCAG 2.1. Vous n'avez jamais besoin de définir une couleur de texte distincte.
bloc de style
Remplacements précis par élément appliqués après le thème. Cascade de règles : by_id remplace by_type. Chaque sous-bloc mappe une clé à une carte de propriétés.
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 | — | Styles appliqués à tous les nœuds d'un type donné |
by_id | Record<id, StyleProps> | No | — | Styles appliqués à un identifiant de nœud spécifique – priorité la plus élevée |
by_edge_kind | Record<EdgeKind, StyleProps> | No | — | Styles appliqués à toutes les arêtes d'un type donné |
by_edge_attr | Record<attrName, StyleProps> | No | — | Styles appliqués aux arêtes dont l'attr booléen nommé est true |
Codes de diagnostic
Tous les diagnostics incluent un emplacement code, severity, message et un line:col facultatif. Le tableau ci-dessous répertorie tous les codes que la chaîne d'outils peut émettre.
Erreurs (E×××)
- `E100` — L'en-tête magique
#!DATRO 1.0est manquant ou mal formé - `E201` — ID de nœud en double
- `E202` — Le nœud fait référence à un identifiant de groupe inconnu
- `E301` — Nœud Edge
fromintrouvable - `E302` — Nœud Edge
tointrouvable - `E303` — Le bord
weightest négatif - `E401` — ID de groupe en double
- `E402` — Le groupe
membersfait référence à un identifiant inconnu - `E403` — Le nœud est affecté à plusieurs groupes
- `E404` — Imbrication de groupe circulaire détectée
- `E500` — La règle de contrainte comporte une erreur de syntaxe
- `E501` — La règle de contrainte est violée (la gravité reflète celle de la contrainte
severity)
Avertissements (W×××)
- `W301` — Bord en double (même de/vers/genre/étiquette)
- `W501` — La règle de contrainte utilise un verbe inconnu
- `W601` — L'étiquette du nœud dépasse
max_label_length(80 caractères par défaut) - `W602` — La couleur de la palette de thèmes est inférieure au contraste WCAG AA (4,5:1)
- `W603` — La couleur de la palette de thèmes est inférieure au contraste WCAG AAA (7.0:1)
Conseils d'information (I×××)
- `I001` — Nœud isolé — aucun bord ne s'y connecte
- `I002` — Groupe vide — aucun membre déclaré
- `I003` — Pas de bloc
meta— recommandé pour la documentation - `I601` — Aucune palette de thème définie — vérifications de contraste ignorées
Prochaines étapes
- Utilisez le CLI Reference pour valider, formater et exporter à partir de la ligne de commande.
- Intégrez des diagrammes dans Markdown avec le Markdown plugin.
- Revenez à Quick Start pour une procédure pas à pas.
Essayez la langue complète en direct : collez n'importe quel extrait ci-dessus et validez instantanément.