Diagram Maker›Language Reference
📐

Language Reference

Full syntax — every block, field, and diagnostic code

言語リファレンス

Datro DSL の完全な構文リファレンス (.dtro ファイル)。すべてのブロック タイプ、すべてのフィールド、すべての診断コードがすべて 1 か所にまとめられています。

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。

エッジブロック

2 つのノード間の関係を宣言します。エッジの方向は宣言に直接記述されます: -> (有向)、<-> (双方向)、または -- (無向)。

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相対的なトラフィックの重み - 重いエッジはより厚く表示されます
asyncbooleanNotrue の場合、エッジは破線でレンダリングされます (fire-and-forget)
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。

グループブロック

関連するノードをラベル付きのサブグラフ ボックスにクラスタリングします。ノードは最大 1 つのグループに属することができます。 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 (または severity: warn の場合は W501) が生成されます。 rule フィールドは、簡潔な 3 トークン文法を使用します。

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 ノードへの有向エッジが少なくとも 1 つ必要です。
  • `!<->` — SUBJECT ノードと OBJECT ノードの間に双方向エッジは存在できません。
  • `<->` — すべての SUBJECT ノードには、いくつかの OBJECT ノードへの双方向エッジが必要です。
  • `in` — すべての SUBJECT ノードは OBJECT グループのメンバーである必要があります。
  • `!in` — SUBJECT ノードを OBJECT グループのメンバーにすることはできません。
💡

サブジェクトとオブジェクトのトークン

各トークンは、ノード タイプ (database、external、…)、グループ ID (例: data_tier)、または * (すべてのノードに一致するワイルドカード) にすることができます。

インポートブロック

大きな図を複数の .dtro ファイルに分割します。リゾルバーは、インポートされた IR を検証前に親にマージします。名前空間には as を使用し、特定の ID をホワイトリストに登録するには expose を使用します。

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 は、ノード タイプを 16 進数の色にマップします。 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 を反映しています)

警告 (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 に戻って、段階的なチュートリアルをご覧ください。
ダイアグラムメーカーを開く

完全な言語をライブで試してください。上記のスニペットを貼り付けて、すぐに検証してください。

Schema v1 · Updated October 2026