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 | متغير الرسم البياني |
كتلة العقدة
يعلن كيان في الرسم التخطيطي. تحتوي كل عقدة على معرف فريد، و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 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 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 | — | الأنماط المطبقة على الحواف حيث يكون attr المنطقي المسمى هو true |
رموز التشخيص
تتضمن جميع التشخيصات موقع code، severity، message، وموقع line:col اختياري. يسرد الجدول أدناه كل التعليمات البرمجية التي يمكن لسلسلة الأدوات إصدارها.
الأخطاء (E×××)
- `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 للحصول على إرشادات خطوة بخطوة.
جرب اللغة الكاملة مباشرة - الصق أي مقتطف أعلاه وقم بالتحقق من صحته على الفور.