Diagram Maker›Language Reference
📐

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.

23 types de nœuds21 types de bords6 verbes de contrainteWCAG 2.1 AA/AAA

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
#!DATRO 1.0
Première ligne obligatoire – `1.0` est la version actuelle des spécifications

mé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
#!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
titlestringNoTitre du diagramme lisible par l'homme
versionstringNoVersion sémantique du diagramme
descriptionstringNoDescription en texte libre
authorstringNoNom de l'auteur ou email
ownerstringNoÉquipe ou personne responsable
tagsstring[]NoBalises de classification arbitraires
slastringNoObjectif de niveau de service, par ex. "99.9%"
criticalitystringNoNiveau de criticité : "P0" | "high" | "medium" | "low"
kindDiagramKind
"architecture""mindmap""state""sequence""algorithm"
NoVariante 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.

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
ididentifierYesIdentificateur de nœud unique : alphanumérique + trait de soulignement
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"
NoCatégorie de nœud sémantique
labelstringNoAfficher le texte affiché dans le diagramme
groupidentifierNoID de groupe auquel ce nœud appartient (alternative à group.members)
attrsAttrMapNoMé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é).

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 du nœud source
directionEdgeDir
"->""<->""--"
YesType de flèche écrit en ligne
toidentifierYesID du nœud cible
kindEdgeKind
"http""grpc""graphql""websocket""tcp""udp""query""event""publish""subscribe""stream""call""read""write""deploys""monitors""depends""extends""implements""triggers""unknown"
NoType de relation sémantique : détermine la couleur et le style
labelstringNoTexte court affiché sur la ligne de bord
weightnumberNoPoids du trafic relatif — les bords plus lourds rendent plus épais
asyncbooleanNoLorsque true, le bord s'affiche en pointillés (tirer et oublier)
attrsAttrMapNoMé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.

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
ididentifierYesIdentifiant unique du groupe
labelstringNoÉtiquette d'affichage pour la boîte de sous-graphique
membersidentifier[]NoID de nœud ou de groupe à inclure – est prioritaire sur node { group: X }
attrsAttrMapNoMé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.

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
idstringNoIdentificateur de règle lisible par l'homme facultatif
rulestringYesSUBJECT VERB OBJECT — voir le tableau des verbes ci-dessous
messagestringNoMessage personnalisé affiché dans les diagnostics lorsque la règle est violée
severityConstraintSeverity
"error""warn"
NoGravité du diagnostic en cas de violation

Verbes de contrainte

  • `!->` — aucun nœud SUBJECT ne peut avoir un bord dirigé vers un nœud OBJECT.
  • `->` — chaque nœud SUBJECT doit avoir au moins un bord dirigé vers un nœud OBJECT.
  • `!<->` — aucun bord bidirectionnel ne peut exister entre les nœuds SUBJECT et OBJECT.
  • `<->` — chaque nœud SUBJECT doit avoir un bord bidirectionnel vers un nœud OBJECT.
  • `in` — chaque nœud SUBJECT doit être membre du groupe OBJECT.
  • `!in` — aucun nœud SUBJECT ne peut être membre du groupe OBJECT.
💡

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.

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
pathstringYesChemin relatif ou absolu vers le fichier .dtro
asidentifierNoAlias d'espace de noms – tous les identifiants importés portent le préfixe alias.id
exposeidentifier[]NoListe 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.

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"
NoDirection du flux graphique
algoLayoutAlgo
"dagre""dot""elk""force""none"
NoAlgorithme de mise en page
node_sepnumberNoPixels minimum entre les nœuds adjacents du même rang
rank_sepnumberNoPixels minimum entre les rangs
marginnumberNoMarge du graphique en pixels
cluster_paddingnumberNoRembourrage 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.

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

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.

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>NoStyles appliqués à tous les nœuds d'un type donné
by_idRecord<id, StyleProps>NoStyles appliqués à un identifiant de nœud spécifique – priorité la plus élevée
by_edge_kindRecord<EdgeKind, StyleProps>NoStyles appliqués à toutes les arêtes d'un type donné
by_edge_attrRecord<attrName, StyleProps>NoStyles 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.0 est 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 from introuvable
  • `E302` — Nœud Edge to introuvable
  • `E303` — Le bord weight est négatif
  • `E401` — ID de groupe en double
  • `E402` — Le groupe members fait 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.
Ouvrir le créateur de diagrammes

Essayez la langue complète en direct : collez n'importe quel extrait ci-dessus et validez instantanément.

Schema v1 · Updated October 2026