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 | — | Цель уровня обслуживания, например. [[[ТК0]]] |
criticality | string | No | — | Уровень критичности: "P0" | [[[ТК1]]] | [[[ТК2]]] | [[[ТК3]]] |
kind | DiagramKind "architecture""mindmap""state""sequence""algorithm" | No | architecture | Вариант схемы |
узловой блок
Объявляет сущность на диаграмме. Каждый узел имеет уникальный идентификатор, семантический 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 | — | Идентификатор группы, к которой принадлежит этот узел (альтернатива 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 | — | Идентификатор исходного узла |
direction | EdgeDir "->""<->""--" | Yes | — | Тип стрелки, написанный в строке |
to | identifier | Yes | — | Идентификатор целевого узла |
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 срабатывает при конфликтах. Группы могут быть вложенными: идентификатор участника может ссылаться на другой идентификатор группы.
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 | [] | Идентификаторы узлов или групп для включения — имеют приоритет над 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, …), идентификатором группы (например, data_tier) или * (подстановочный знак, соответствующий каждому узлу).
блок импорта
Разбивает большие диаграммы на несколько файлов .dtro. Резолвер объединяет импортированный IR с родительским перед проверкой. Используйте as для пространства имен и 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 | — | Псевдоним пространства имен — все импортированные идентификаторы имеют префикс alias.id |
expose | identifier[] | No | — | Белый список — только эти идентификаторы объединяются в родительский 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 | — | Стили, применяемые к определенному идентификатору узла — наивысший приоритет |
by_edge_kind | Record<EdgeKind, StyleProps> | No | — | Стили применяются ко всем краям данного типа. |
by_edge_attr | Record<attrName, StyleProps> | No | — | Стили, применяемые к краям, где именованный логический атрибут равен true |
Диагностические коды
Все диагностические данные включают в себя code, severity, message и необязательное расположение line:col. В таблице ниже перечислены все коды, которые может генерировать инструментальная цепочка.
Ошибки (Е×××)
- `E100` — Магический заголовок
#!DATRO 1.0отсутствует или имеет неверный формат. - `E201` — Повторяющийся идентификатор узла
- `E202` — Узел ссылается на неизвестный идентификатор группы.
- `E301` — Краевой узел
fromне найден - `E302` — Краевой узел
toне найден - `E303` — Край
weightотрицательный - `E401` — Повторяющийся идентификатор группы
- `E402` — Группа
membersссылается на неизвестный идентификатор. - `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 с помощью Markdown plugin.
- Вернитесь к Quick Start для пошагового руководства.
Попробуйте полную версию языка вживую — вставьте любой фрагмент выше и подтвердите мгновенно.