Diagram Maker›Language Reference
📐

Language Reference

Full syntax — every block, field, and diagnostic code

Справочник по языкам

Полный справочник по синтаксису Datro DSL (файлы .dtro). Каждый тип блока, каждое поле, каждый диагностический код — все в одном месте.

23 типа узлов21 вид кромок6 глаголов-ограничителейWCAG 2.1 АА/ААА

Волшебный заголовок

Каждый файл .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Цель уровня обслуживания, например. [[[ТК0]]]
criticalitystringNoУровень критичности: "P0" | [[[ТК1]]] | [[[ТК2]]] | [[[ТК3]]]
kindDiagramKind
"architecture""mindmap""state""sequence""algorithm"
NoВариант схемы

узловой блок

Объявляет сущность на диаграмме. Каждый узел имеет уникальный идентификатор, семантический 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Идентификатор группы, к которой принадлежит этот узел (альтернатива 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Идентификатор исходного узла
directionEdgeDir
"->""<->""--"
YesТип стрелки, написанный в строке
toidentifierYesИдентификатор целевого узла
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 срабатывает при конфликтах. Группы могут быть вложенными: идентификатор участника может ссылаться на другой идентификатор группы.

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Идентификаторы узлов или групп для включения — имеют приоритет над 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, …), идентификатором группы (например, data_tier) или * (подстановочный знак, соответствующий каждому узлу).

блок импорта

Разбивает большие диаграммы на несколько файлов .dtro. Резолвер объединяет импортированный IR с родительским перед проверкой. Используйте as для пространства имен и 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Псевдоним пространства имен — все импортированные идентификаторы имеют префикс alias.id
exposeidentifier[]NoБелый список — только эти идентификаторы объединяются в родительский 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Стили, применяемые к определенному идентификатору узла — наивысший приоритет
by_edge_kindRecord<EdgeKind, StyleProps>NoСтили применяются ко всем краям данного типа.
by_edge_attrRecord<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 для пошагового руководства.
Открыть конструктор диаграмм

Попробуйте полную версию языка вживую — вставьте любой фрагмент выше и подтвердите мгновенно.

Schema v1 · Updated October 2026