Language Reference
Full syntax — every block, field, and diagnostic code
语言参考
Datro DSL 的完整语法参考(.dtro 文件)。每个块类型、每个字段、每个诊断代码 - 全部集中在一个位置。
魔术头
每个 .dtro 文件 必须 以第 1 行的魔术头开始。如果 E100 丢失或格式错误,解析器将返回。
#!DATRO 1.0元块
可选的文档级元数据。如果省略,则生成 I003 信息提示。除 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 | — | 人类可读的图表标题 |
version | string | No | — | 该图的语义版本 |
description | string | No | — | 自由文本描述 |
author | string | No | — | 作者姓名或电子邮件 |
owner | string | No | — | 团队或负责人 |
tags | string[] | No | — | 任意分类标签 |
sla | string | No | — | 服务水平目标,例如"99.9%" |
criticality | string | No | — | 关键等级:"P0" | "high" | "medium" | "low" |
kind | DiagramKind "architecture""mindmap""state""sequence""algorithm" | No | architecture | 图表变体 |
节点块
在图中声明一个实体。每个节点都有一个唯一的 ID、控制其渲染形状和默认颜色的语义 type 以及用于元数据的可选 attrs 块。
# 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 | — | 唯一节点标识符——字母数字+下划线 |
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 | 语义节点类别 |
label | string | No | (node id) | 显示图中所示的文字 |
group | identifier | No | — | 该节点所属的组 ID(替代 group.members) |
attrs | AttrMap | No | — | 任意键值元数据 — 字符串、数字、布尔值或数组 |
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。
边缘块
声明两个节点之间的关系。边缘方向直接写在声明中:->(有向)、<->(双向)或--(无向)。
# 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 |
direction | EdgeDir "->""<->""--" | Yes | — | 内嵌箭头类型 |
to | identifier | Yes | — | 目标节点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 | 语义关系类型——驱动颜色和风格 |
label | string | No | — | 边缘线上显示短文本 |
weight | number | No | 1.0 | 相对流量权重——较重的边缘呈现较厚 |
async | boolean | No | false | 当 true 时,边缘呈现为虚线(即发即弃) |
attrs | AttrMap | No | — | 任意元数据 - 传递到 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。
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 | — | 唯一的组标识符 |
label | string | No | (group id) | 显示子图框的标签 |
members | identifier[] | No | [] | 要包含的节点或组 ID — 优先于 node { group: X } |
attrs | AttrMap | No | — | 任意元数据 |
约束块
声明验证器根据 IR 进行评估的架构规则。违规会产生 E501(或 W501,当 severity: warn 时)。 rule 字段使用简洁的三标记语法。
# 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 | — | 可选的人类可读规则标识符 |
rule | string | Yes | — | SUBJECT VERB OBJECT — 参见下面的动词表 |
message | string | No | — | 违反规则时诊断中显示的自定义消息 |
severity | ConstraintSeverity "error""warn" | No | error | 违反时的诊断严重程度 |
约束动词
- `!->` —
SUBJECT节点不能与任何OBJECT节点有有向边。 - `->` — 每个
SUBJECT节点必须至少有一个到OBJECT节点的有向边。 - `!<->` —
SUBJECT和OBJECT节点之间不能存在双向边。 - `<->` — 每个
SUBJECT节点必须具有到某个OBJECT节点的双向边。 - `in` — 每个
SUBJECT节点必须是OBJECT组的成员。 - `!in` —
SUBJECT节点不能是OBJECT组的成员。
主体和客体标记
每个令牌可以是节点类型(database、external、...)、组 ID(例如 data_tier)或 *(与每个节点匹配的通配符)。
导入块
将大图表拆分为多个 .dtro 文件。解析器在验证之前将导入的 IR 合并到父级中。使用 as 作为命名空间,使用 expose 将特定 ID 列入白名单。
# 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 | — | .dtro 文件的相对或绝对路径 |
as | identifier | No | — | 命名空间别名 — 所有导入的 ID 均以 alias.id 为前缀 |
expose | identifier[] | No | — | 白名单 — 只有这些 id 会合并到父 IR 中 |
布局块
向渲染器提示如何排列图形。所有字段都是可选的——当块被省略时,渲染器使用合理的默认值。
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 | 图流向 |
algo | LayoutAlgo "dagre""dot""elk""force""none" | No | dagre | 布局算法 |
node_sep | number | No | 60 | 同一等级中相邻节点之间的最小像素 |
rank_sep | number | No | 120 | 等级之间的最小像素 |
margin | number | No | 20 | 图形边距(以像素为单位) |
cluster_padding | number | No | 16 | 组边界框内的额外填充 |
主题块
控制渲染图的视觉外观。 palette 将节点类型映射到十六进制颜色。 accessibility 子块启用自动 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
}
}自动字体颜色
DOT 导出器使用 WCAG 2.1 相对亮度公式自动为每个节点填充选取黑色或白色文本。您永远不需要设置单独的文本颜色。
风格块
在主题之后应用细粒度的每个元素覆盖。规则级联:by_id 覆盖 by_type。每个子块将一个键映射到一个属性映射。
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 | — | 应用于给定类型的所有节点的样式 |
by_id | Record<id, StyleProps> | No | — | 应用于特定节点 ID 的样式 — 最高优先级 |
by_edge_kind | Record<EdgeKind, StyleProps> | No | — | 应用于给定类型的所有边缘的样式 |
by_edge_attr | Record<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` — 未定义主题调色板 — 跳过对比度检查
后续步骤
- 使用 CLI Reference 从命令行进行验证、格式化和导出。
- 使用 Markdown plugin 在 Markdown 中嵌入图表。
- 返回 Quick Start 查看分步演练。
实时尝试完整的语言 - 粘贴上面的任何片段并立即验证。