Diagram Maker›Language Reference
📐

Language Reference

Full syntax — every block, field, and diagnostic code

语言参考

Datro DSL 的完整语法参考(.dtro 文件)。每个块类型、每个字段、每个诊断代码 - 全部集中在一个位置。

23种节点类型21种边缘6个约束动词WCAG 2.1 AA/AAA

魔术头

每个 .dtro 文件 必须 以第 1 行的魔术头开始。如果 E100 丢失或格式错误,解析器将返回。

DATRO
#!DATRO 1.0
必需的第一行 - `1.0` 是当前规范版本

元块

可选的文档级元数据。如果省略,则生成 I003 信息提示。除 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
titlestringNo人类可读的图表标题
versionstringNo该图的语义版本
descriptionstringNo自由文本描述
authorstringNo作者姓名或电子邮件
ownerstringNo团队或负责人
tagsstring[]No任意分类标签
slastringNo服务水平目标,例如"99.9%"
criticalitystringNo关键等级:"P0" | "high" | "medium" | "low"
kindDiagramKind
"architecture""mindmap""state""sequence""algorithm"
No图表变体

节点块

在图中声明一个实体。每个节点都有一个唯一的 ID、控制其渲染形状和默认颜色的语义 type 以及用于元数据的可选 attrs 块。

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
ididentifierYes唯一节点标识符——字母数字+下划线
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"
No语义节点类别
labelstringNo显示图中所示的文字
groupidentifierNo该节点所属的组 ID(替代 group.members)
attrsAttrMapNo任意键值元数据 — 字符串、数字、布尔值或数组
ℹ️

23种节点类型

所有 23 个值:service database queue cache gateway user actor system external process storage function broker scheduler load_balancer cdn dns firewall client mobile web iot unknown。

边缘块

声明两个节点之间的关系。边缘方向直接写在声明中:->(有向)、<->(双向)或--(无向)。

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
fromidentifierYes源节点id
directionEdgeDir
"->""<->""--"
Yes内嵌箭头类型
toidentifierYes目标节点id
kindEdgeKind
"http""grpc""graphql""websocket""tcp""udp""query""event""publish""subscribe""stream""call""read""write""deploys""monitors""depends""extends""implements""triggers""unknown"
No语义关系类型——驱动颜色和风格
labelstringNo边缘线上显示短文本
weightnumberNo相对流量权重——较重的边缘呈现较厚
asyncbooleanNo当 true 时,边缘呈现为虚线(即发即弃)
attrsAttrMapNo任意元数据 - 传递到 JSON IR 和工具提示
ℹ️

21种边缘

所有 21 个值:http grpc graphql websocket tcp udp query event publish subscribe stream call read write deploys monitors depends extends implements triggers unknown。

组块

将相关节点聚类到带标签的子图框中。一个节点最多可以属于一个组 - E403 发生冲突时触发。组可以嵌套:一个成员 ID 可以引用另一个组 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
ididentifierYes唯一的组标识符
labelstringNo显示子图框的标签
membersidentifier[]No要包含的节点或组 ID — 优先于 node { group: X }
attrsAttrMapNo任意元数据

约束块

声明验证器根据 IR 进行评估的架构规则。违规会产生 E501(或 W501,当 severity: warn 时)。 rule 字段使用简洁的三标记语法。

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
idstringNo可选的人类可读规则标识符
rulestringYesSUBJECT VERB OBJECT — 参见下面的动词表
messagestringNo违反规则时诊断中显示的自定义消息
severityConstraintSeverity
"error""warn"
No违反时的诊断严重程度

约束动词

  • `!->` — SUBJECT 节点不能与任何 OBJECT 节点有有向边。
  • `->` — 每个 SUBJECT 节点必须至少有一个到 OBJECT 节点的有向边。
  • `!<->` — SUBJECT 和 OBJECT 节点之间不能存在双向边。
  • `<->` — 每个 SUBJECT 节点必须具有到某个 OBJECT 节点的双向边。
  • `in` — 每个 SUBJECT 节点必须是 OBJECT 组的成员。
  • `!in` — SUBJECT 节点不能是 OBJECT 组的成员。
💡

主体和客体标记

每个令牌可以是节点类型(database、external、...)、组 ID(例如 data_tier)或 *(与每个节点匹配的通配符)。

导入块

将大图表拆分为多个 .dtro 文件。解析器在验证之前将导入的 IR 合并到父级中。使用 as 作为命名空间,使用 expose 将特定 ID 列入白名单。

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
pathstringYes.dtro 文件的相对或绝对路径
asidentifierNo命名空间别名 — 所有导入的 ID 均以 alias.id 为前缀
exposeidentifier[]No白名单 — 只有这些 id 会合并到父 IR 中

布局块

向渲染器提示如何排列图形。所有字段都是可选的——当块被省略时,渲染器使用合理的默认值。

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"
No图流向
algoLayoutAlgo
"dagre""dot""elk""force""none"
No布局算法
node_sepnumberNo同一等级中相邻节点之间的最小像素
rank_sepnumberNo等级之间的最小像素
marginnumberNo图形边距(以像素为单位)
cluster_paddingnumberNo组边界框内的额外填充

主题块

控制渲染图的视觉外观。 palette 将节点类型映射到十六进制颜色。 accessibility 子块启用自动 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
  }
}
💡

自动字体颜色

DOT 导出器使用 WCAG 2.1 相对亮度公式自动为每个节点填充选取黑色或白色文本。您永远不需要设置单独的文本颜色。

风格块

在主题之后应用细粒度的每个元素覆盖。规则级联:by_id 覆盖 by_type。每个子块将一个键映射到一个属性映射。

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>No应用于给定类型的所有节点的样式
by_idRecord<id, StyleProps>No应用于特定节点 ID 的样式 — 最高优先级
by_edge_kindRecord<EdgeKind, StyleProps>No应用于给定类型的所有边缘的样式
by_edge_attrRecord<attrName, StyleProps>No应用于指定布尔属性为 true 的边的样式

诊断代码

所有诊断均包括 code、severity、message 和可选的 line:col 位置。下表列出了工具链可以发出的每个代码。

错误(E×××)

  • `E100` — 魔法标头 #!DATRO 1.0 丢失或格式错误
  • `E201` — 重复的节点 ID
  • `E202` — 节点引用未知的组 ID
  • `E301` — 未找到边 from 节点
  • `E302` — 未找到边 to 节点
  • `E303` — 边沿 weight 为负
  • `E401` — 重复的组 ID
  • `E402` — 组 members 引用未知 ID
  • `E403` — 节点被分配给多个组
  • `E404` - 检测到循环组嵌套
  • `E500` — 约束规则有语法错误
  • `E501` — 违反约束规则(严重性反映约束本身的 severity)

警告(宽×××)

  • `W301` - 重复边缘(相同的来源/目标/种类/标签)
  • `W501` - 约束规则使用未知动词
  • `W601` — 节点标签超过 max_label_length(默认 80 个字符)
  • `W602` — 主题调色板颜色低于 WCAG AA 对比度 (4.5:1)
  • `W603` — 主题调色板颜色低于 WCAG AAA 对比度 (7.0:1)

信息提示(I×××)

  • `I001` — 孤立节点 — 没有边连接到它
  • `I002` — 空组 — 没有声明成员
  • `I003` — 无 meta 块 — 建议用于文档
  • `I601` — 未定义主题调色板 — 跳过对比度检查

后续步骤

打开图表制作器

实时尝试完整的语言 - 粘贴上面的任何片段并立即验证。

Schema v1 · Updated October 2026