Diagram Maker›Language Reference
📐

Language Reference

Full syntax — every block, field, and diagnostic code

Reference til sproget

Fuldsyntaxreference til Datro DSL (.dtro-filer). Alle bloktyper, alle felter, alle diagnostiske koder på ét sted.

23 nodetyper21 kanttyper6 begrænsningsordWCAG 2.1 AA/AAA

Magisk overskrift

Hver .dtro-fil skal begynde med den magiske overskrift på linje 1. Parsereren returnerer E100, hvis den mangler eller er fejlagtig.

DATRO
#!DATRO 1.0
Forpligtet første linje `1.0` er den aktuelle specifikationsversion

Meta blok

Optativ metadata på dokumentniveau. Det giver I003 info hint, hvis det ikke er angivet. Alle felter er valgfrie strings/arrays med undtagelse af 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
titlestringNoIndtitel på et diagram, der kan læses af mennesker
versionstringNoSemantisk version af diagrammet
descriptionstringNoBeskrivelse af frit tekst
authorstringNoForfatterens navn eller e-mail
ownerstringNoTeam eller ansvarlig person
tagsstring[]NoArbitrære klassificeringsmærker
slastringNoTjenesteniveaumål, f.eks. "99.9%"
criticalitystringNoKritisk niveau: "P0" "high" "medium" "low"
kindDiagramKind
"architecture""mindmap""state""sequence""algorithm"
NoDiagramvarianten

Nodeblok

Annoncerer en enhed i diagrammet. Hver node har et unikt id, en semantisk type, der kontrollerer dens afleverede form og standardfarve, og en valgfri attrs-blok for metadata.

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
ididentifierYesUnique node identifier alfanumerisk + underpunkt
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"
NoKategori af semantiske noder
labelstringNoVis tekst i diagrammet
groupidentifierNoGruppen id dette knot tilhører (alternativ til group.members)
attrsAttrMapNoVilkårløst nøgleværdi metadata strenge, tal, booleaner eller matriser
ℹ️

23 nodetyper

Alle 23 værdier: service database queue cache gateway user actor system external process storage function broker scheduler load_balancer cdn dns firewall client mobile web iot unknown.

kantblok

Det erklærer et forhold mellem to knuder. Randretning skrives direkte i erklæringen: -> (dirigeret), <-> (bidirectional) eller -- (undirigeret).

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
fromidentifierYesKilde noden id
directionEdgeDir
"->""<->""--"
YesPiletype skrevet i linje
toidentifierYesTiltænkning
kindEdgeKind
"http""grpc""graphql""websocket""tcp""udp""query""event""publish""subscribe""stream""call""read""write""deploys""monitors""depends""extends""implements""triggers""unknown"
NoSemantisk relationstype driver farve og stil
labelstringNoKort tekst vises på kantlinjen
weightnumberNoRelativ trafikvægt tungere kanter gør tykkere
asyncbooleanNoNår true, kanten giver som dashed (brand og glem)
attrsAttrMapNoVældige metadata overført til JSON IR og værktøjstips
ℹ️

21 kanttyper

Alle 21 værdier: http grpc graphql websocket tcp udp query event publish subscribe stream call read write deploys monitors depends extends implements triggers unknown.

gruppeblok

Klustere relaterede knuder i en mærket undergraf boks. En knud kan tilhøre højst én gruppe E403 bryder på konflikter. Gruppen kan være indlejret: en medlem id kan henvise til en anden gruppe id.

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
ididentifierYesUnge grupper
labelstringNoDisplay-mærket til undergrafboksen
membersidentifier[]NoNode- eller gruppe-id'er til at omfatte har forrang over node { group: X }
attrsAttrMapNoVældige metadata

Blokke

Der erklæres en arkitektonisk regel, som validatoren vurderer i forhold til IR. Overtrædelser producerer E501 (eller W501, når severity: warn). Feltet rule bruger en kortfattet tre-token grammatik.

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
idstringNoVælgelsespraksis for regler, der kan læses af mennesker
rulestringYesSUBJECT VERB OBJECT se verbal tabel nedenfor
messagestringNoEn brugerdefineret besked, der vises i diagnostikken, når reglen overtrædes
severityConstraintSeverity
"error""warn"
NoDiagnostikkens alvorlighed, når overtrædelsen er overtrådt

Tilskudssag

  • `!->` Ingen SUBJECT-node kan have en rettet kant til et hvilket som helst OBJECT-node.
  • `->` hver SUBJECT-knode skal have mindst én rettet kant til en OBJECT-knode.
  • `!<->` Der må ikke være en bidirectional kant mellem SUBJECT og OBJECT-knoderne.
  • `<->` hver SUBJECT-knode skal have en bidirectional kant til et eller andet OBJECT-knode.
  • `in` hver SUBJECT-node skal være medlem af OBJECT-gruppen.
  • `!in` Ingen SUBJECT-node kan være medlem af gruppen OBJECT.
💡

Subjekt- og objekttokens

Hver token kan være en node type (database, external,.), en gruppe id (f.eks. data_tier) eller * (wildcard matching hver node).

importblok

Splittet store diagrammer over flere .dtro filer. Resolveren fusionerer importeret IR i modersystemet før validering. Brug as til navnepacing og expose til whitelist specifikke id'er.

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
pathstringYesRelativt eller absolut vej til .dtro-filen
asidentifierNoNavnrude alias alle indførte id er præfixeret alias.id
exposeidentifier[]NoHvidliste kun disse ID'er er fusioneret i den moders IR

blokke

Tipper til rendereren om, hvordan man arrangerer grafen. Alle felter er valgfrie rendereren bruger fornuftige standarder, når blokken udledes.

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"
NoGrafstrømningsretning
algoLayoutAlgo
"dagre""dot""elk""force""none"
NoLayout algoritme
node_sepnumberNoMindste pixel mellem tilstødende noder i samme rang
rank_sepnumberNoMindste pixel mellem række
marginnumberNoGrafmargin i pixels
cluster_paddingnumberNoYderligere fyldning inde i gruppegrænser

temablok

Kontroller den visuelle udseende af det fremstillede diagram. palette kortlægger nodetyper til heks farver. Underblokken accessibility muliggør automatisk kontrastkontrol af 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
  }
}
💡

Automatisk skrifttypefarve

DOT-eksportøren vælger automatisk sort eller hvid tekst til hver knudefyldning ved hjælp af WCAG 2.1-formlen for relativ lysstyrke. Du behøver aldrig at indstille en separat tekstfarve.

stilblok

Fintkorn per-element overrides anvendes efter temaet. Regler kaskade: by_id overrides by_type. Hver subblok kortlægger en nøgle til et egenskab kort.

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 anvendt på alle noder af en given type
by_idRecord<id, StyleProps>NoStyles anvendt på en bestemt nod id højeste prioritet
by_edge_kindRecord<EdgeKind, StyleProps>NoStyles, der anvendes på alle kanter af en given art
by_edge_attrRecord<attrName, StyleProps>NoStyles anvendt på kanter, hvor den navngivne boolean attr er true

Diagnostikkoder

Alle diagnostik omfatter en code, severity, message og en valgfri line:col placering. Tabellen nedenfor viser alle koder, som værktøjskæden kan udsende.

Fejl (E×××)

  • `E100` Magisk overskrift #!DATRO 1.0 mangler eller er defekt
  • `E201` Dupliceret nod-id
  • `E202` Node refererer til en ukendt gruppe-id
  • `E301` Edge from-node ikke fundet
  • `E302` Edge to-node ikke fundet
  • `E303` Edge weight er negativ
  • `E401` Dupliceret gruppe-id
  • `E402` Gruppe members henviser til en ukendt id
  • `E403` Node er tildelt mere end én gruppe
  • `E404` Detekteret cirkulær gruppe-nedering
  • `E500` Fraværsreglen har en syntaxfejl
  • `E501` En begrænsningsregel overtrædes (sværtheden afspejler den begrænsning, der er underlagt severity)

Advarsler (W××)

  • `W301` Duplikat kant (det samme fra/til/typen/mærket)
  • `W501` Bindelsesreglen bruger et ukendt verb
  • `W601` Node-mærket overstiger max_label_length (afvigelse 80 kar)
  • `W602` Farve på temapaletten falder under WCAG AA kontrast (4.5:1)
  • `W603` Farve på temapaletten falder under WCAG AAA kontrast (7,0:1)

Indslag til oplysninger

  • `I001` Isoleret knop ingen kanter forbinder med det
  • `I002` Frit gruppe Ingen medlemmer erklæret
  • `I003` Ingen meta-blok 001 anbefalet til dokumentation
  • `I601` Ingen tematiske palæter defineret Kontrastkontrol overgået

Næste trin

  • Brug CLI Reference til at validerere, formatere og eksportere fra kommandoen.
  • Indlej diagrammer i Markdown med Markdown plugin.
  • Gå tilbage til [Quick Start] (/docs/datro-quickstart) for en trin for trin gennemgang.
Åben diagrammaker

Prøv det fulde sprog live indsæt et uddrag ovenfor og bekræft øjeblikkeligt.

Schema v1 · Updated October 2026