Language Reference
Full syntax — every block, field, and diagnostic code
言語リファレンス
Datro DSL の完全な構文リファレンス (.dtro ファイル)。すべてのブロック タイプ、すべてのフィールド、すべての診断コードがすべて 1 か所にまとめられています。
マジックヘッダー
すべての .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。
エッジブロック
2 つのノード間の関係を宣言します。エッジの方向は宣言に直接記述されます: -> (有向)、<-> (双方向)、または -- (無向)。
# 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 の場合、エッジは破線でレンダリングされます (fire-and-forget) |
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。
グループブロック
関連するノードをラベル付きのサブグラフ ボックスにクラスタリングします。ノードは最大 1 つのグループに属することができます。 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 (または severity: warn の場合は W501) が生成されます。 rule フィールドは、簡潔な 3 トークン文法を使用します。
# 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ノードへの有向エッジが少なくとも 1 つ必要です。 - `!<->` —
SUBJECTノードとOBJECTノードの間に双方向エッジは存在できません。 - `<->` — すべての
SUBJECTノードには、いくつかのOBJECTノードへの双方向エッジが必要です。 - `in` — すべての
SUBJECTノードはOBJECTグループのメンバーである必要があります。 - `!in` —
SUBJECTノードをOBJECTグループのメンバーにすることはできません。
サブジェクトとオブジェクトのトークン
各トークンは、ノード タイプ (database、external、…)、グループ ID (例: data_tier)、または * (すべてのノードに一致するワイルドカード) にすることができます。
インポートブロック
大きな図を複数の .dtro ファイルに分割します。リゾルバーは、インポートされた IR を検証前に親にマージします。名前空間には as を使用し、特定の ID をホワイトリストに登録するには expose を使用します。
# 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 は、ノード タイプを 16 進数の色にマップします。 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を反映しています)
警告 (W×××)
- `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 を使用してマークダウンに図を埋め込みます。
- Quick Start に戻って、段階的なチュートリアルをご覧ください。
完全な言語をライブで試してください。上記のスニペットを貼り付けて、すぐに検証してください。