Language Reference
Full syntax — every block, field, and diagnostic code
Dil Referansı
Datro DSL (.dtro dosyaları için tam sözdizimi referansı. Her blok türü, her alan, her teşhis kodu — hepsi tek bir yerde.
Sihirli başlık
Her .dtro dosyası 1. satırdaki sihirli başlıkla başlamalıdır. Ayrıştırıcı, eksik veya hatalı biçimlendirilmişse E100 değerini döndürür.
#!DATRO 1.0meta blok
İsteğe bağlı belge düzeyinde meta veriler. Atlanırsa I003 bilgi ipucu üretir. kind hariç tüm alanlar isteğe bağlı dizeler/dizilerdir.
#!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 | — | İnsan tarafından okunabilen diyagram başlığı |
version | string | No | — | Diyagramın anlamsal versiyonu |
description | string | No | — | Serbest metin açıklaması |
author | string | No | — | Yazar adı veya e-postası |
owner | string | No | — | Ekip veya sorumlu kişi |
tags | string[] | No | — | Keyfi sınıflandırma etiketleri |
sla | string | No | — | Hizmet seviyesi hedefi, ör. "99.9%" |
criticality | string | No | — | Kritiklik kademesi: "P0" | "high" | "medium" | "low" |
kind | DiagramKind "architecture""mindmap""state""sequence""algorithm" | No | architecture | Diyagram varyantı |
düğüm bloğu
Diyagramdaki bir varlığı bildirir. Her düğümün benzersiz bir kimliği, oluşturulan şeklini ve varsayılan rengini kontrol eden bir anlamsal type ve meta veriler için isteğe bağlı bir attrs bloğu vardır.
# 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 | — | Benzersiz düğüm tanımlayıcısı — alfasayısal + alt çizgi |
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 | Anlamsal düğüm kategorisi |
label | string | No | (node id) | Diyagramda gösterilen metni görüntüle |
group | identifier | No | — | Bu düğümün ait olduğu grup kimliği (group.members'a alternatif) |
attrs | AttrMap | No | — | Rastgele anahtar/değer meta verileri — dizeler, sayılar, boole'ler veya diziler |
23 düğüm türü
23 değerin tümü: service database queue cache gateway user actor system external process storage function broker scheduler load_balancer cdn dns firewall client mobile web iot unknown.
kenar bloğu
İki düğüm arasındaki ilişkiyi bildirir. Kenar yönü bildirimde doğrudan yazılır: -> (yönlendirilmiş), <-> (çift yönlü) veya -- (yönsüz).
# 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 | — | Kaynak düğüm kimliği |
direction | EdgeDir "->""<->""--" | Yes | — | Satır içi yazılmış ok türü |
to | identifier | Yes | — | Hedef düğüm kimliği |
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 | Anlamsal ilişki türü — rengi ve stili yönlendirir |
label | string | No | — | Kenar çizgisinde görüntülenen kısa metin |
weight | number | No | 1.0 | Göreli trafik ağırlığı — daha ağır kenarlar daha kalın hale gelir |
async | boolean | No | false | true olduğunda, kenar kesikli çizgi olarak oluşturulur (ateşle ve unut) |
attrs | AttrMap | No | — | Rastgele meta veriler - JSON IR'ye ve araç ipuçlarına aktarıldı |
21 kenar türü
21 değerin tümü: http grpc graphql websocket tcp udp query event publish subscribe stream call read write deploys monitors depends extends implements triggers unknown.
grup bloğu
İlgili düğümleri etiketli bir alt grafik kutusunda kümeler. Bir düğüm en fazla bir gruba ait olabilir — E403 çatışmalarda tetiklenir. Gruplar iç içe yerleştirilebilir: Bir üye kimliği başka bir grup kimliğine referans verebilir.
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 | — | Benzersiz grup tanımlayıcısı |
label | string | No | (group id) | Alt grafik kutusu için etiketi görüntüle |
members | identifier[] | No | [] | Dahil edilecek düğüm veya grup kimlikleri — node { group: X }'a göre önceliklidir |
attrs | AttrMap | No | — | Keyfi meta veriler |
kısıtlama bloğu
Doğrulayıcının IR'ye göre değerlendirdiği bir mimari kural bildirir. İhlaller E501 (veya severity: warn olduğunda W501 üretir. rule alanı kısa ve üç belirteçli bir dilbilgisi kullanır.
# 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 | — | İsteğe bağlı insan tarafından okunabilen kural tanımlayıcı |
rule | string | Yes | — | SUBJECT VERB OBJECT - aşağıdaki fiil tablosuna bakın |
message | string | No | — | Kural ihlal edildiğinde teşhiste gösterilen özel mesaj |
severity | ConstraintSeverity "error""warn" | No | error | İhlal edildiğinde tanının ciddiyeti |
Kısıtlama fiilleri
- `!->` — hiçbir
SUBJECTdüğümü, herhangi birOBJECTdüğümüne yönlendirilmiş bir kenara sahip olamaz. - `->` — her
SUBJECTdüğümü, birOBJECTdüğümüne en az bir yönlendirilmiş kenara sahip olmalıdır. - `!<->` —
SUBJECTveOBJECTdüğümleri arasında çift yönlü kenar mevcut olamaz. - `<->` — her
SUBJECTdüğümünün, bazıOBJECTdüğümlerine çift yönlü bir kenarı olmalıdır. - `in` — her
SUBJECTdüğümü,OBJECTgrubunun üyesi olmalıdır. - `!in` — hiçbir
SUBJECTdüğümü,OBJECTgrubunun üyesi olamaz.
Konu ve nesne belirteçleri
Her belirteç bir düğüm türü (database, external, …), bir grup kimliği (ör. data_tier) veya * (her düğümle eşleşen joker karakter) olabilir.
içe aktarma bloğu
Büyük diyagramları birden fazla .dtro dosyaya böler. Çözümleyici, içe aktarılan IR'yi doğrulamadan önce üst öğeyle birleştirir. Ad alanı için as'i ve belirli kimlikleri beyaz listeye almak için expose'yi kullanın.
# 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 dosyasının göreceli veya mutlak yolu |
as | identifier | No | — | Ad alanı takma adı — içe aktarılan tüm kimliklere alias.id ön eki eklenir |
expose | identifier[] | No | — | Beyaz liste — yalnızca bu kimlikler ana IR ile birleştirilir |
düzen bloğu
Oluşturucuya grafiğin nasıl düzenleneceğine dair ipuçları. Tüm alanlar isteğe bağlıdır; oluşturucu, blok atlandığında mantıklı varsayılanları kullanır.
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 | Grafik akış yönü |
algo | LayoutAlgo "dagre""dot""elk""force""none" | No | dagre | Düzen algoritması |
node_sep | number | No | 60 | Aynı sıradaki bitişik düğümler arasındaki minimum piksel sayısı |
rank_sep | number | No | 120 | Sıralar arasındaki minimum piksel sayısı |
margin | number | No | 20 | Piksel cinsinden grafik kenar boşluğu |
cluster_padding | number | No | 16 | Grup sınırlama kutularının içinde ekstra dolgu |
tema bloğu
İşlenen diyagramın görsel görünümünü kontrol eder. palette, düğüm türlerini onaltılık renklerle eşler. accessibility alt bloğu otomatik WCAG 2.1 kontrast kontrolünü etkinleştirir.
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
}
}Otomatik yazı tipi rengi
DOT dışa aktarıcı, WCAG 2.1 göreli parlaklık formülünü kullanarak her düğüm dolgusu için otomatik olarak siyah veya beyaz metni seçer. Hiçbir zaman ayrı bir metin rengi ayarlamanıza gerek yoktur.
stil bloğu
Temadan sonra uygulanan öğe başına ince taneli geçersiz kılmalar. Kurallar basamaklanır: by_id, by_type'i geçersiz kılar. Her alt blok bir anahtarı bir mülk haritasına eşler.
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 | — | Belirli bir türdeki tüm düğümlere uygulanan stiller |
by_id | Record<id, StyleProps> | No | — | Belirli bir düğüm kimliğine uygulanan stiller — en yüksek öncelik |
by_edge_kind | Record<EdgeKind, StyleProps> | No | — | Belirli bir türün tüm kenarlarına uygulanan stiller |
by_edge_attr | Record<attrName, StyleProps> | No | — | Adlandırılmış boole özniteliğinin true olduğu kenarlara uygulanan stiller |
Teşhis kodları
Tüm teşhisler bir code, severity, message ve isteğe bağlı bir line:col konumu içerir. Aşağıdaki tablo, takım zincirinin yayabileceği her kodu listelemektedir.
Hatalar (E×××)
- `E100` — Sihirli başlık
#!DATRO 1.0eksik veya hatalı biçimlendirilmiş - `E201` — Yinelenen düğüm kimliği
- `E202` — Düğüm bilinmeyen bir grup kimliğine başvuruyor
- `E301` — Kenar
fromdüğümü bulunamadı - `E302` — Kenar
todüğümü bulunamadı - `E303` — Kenar
weightnegatiftir - `E401` — Yinelenen grup kimliği
- `E402` —
membersgrubu bilinmeyen bir kimliğe başvuruyor - `E403` — Düğüm birden fazla gruba atandı
- `E404` — Dairesel grup içi içe yerleştirme algılandı
- `E500` — Kısıtlama kuralında sözdizimi hatası var
- `E501` — Kısıtlama kuralı ihlal edildi (şiddet, kısıtlamanın kendi
severityciddiyetini yansıtıyor)
Uyarılar (G×××)
- `W301` — Yinelenen kenar (ilk/tür/etiketle aynı)
- `W501` — Kısıtlama kuralında bilinmeyen bir fiil kullanılıyor
- `W601` — Düğüm etiketi
max_label_lengthdeğerini aşıyor (varsayılan 80 karakter) - `W602` — Tema paleti rengi WCAG AA kontrastının (4,5:1) altına düşüyor
- `W603` — Tema paleti rengi WCAG AAA kontrastının (7,0:1) altına düşüyor
Bilgi ipuçları (I×××)
- `I001` — Yalıtılmış düğüm — ona hiçbir kenar bağlanmıyor
- `I002` — Boş grup — üye belirtilmedi
- `I003` —
metabloğu yok — dokümantasyon için önerilir - `I601` — Tema paleti tanımlanmadı — kontrast kontrolleri atlandı
Sonraki adımlar
- Komut satırından doğrulamak, biçimlendirmek ve dışa aktarmak için CLI Reference'ı kullanın.
- Diyagramları Markdown'a Markdown plugin ile gömün.
- Adım adım açıklama için Quick Start'a geri dönün.
Dilin tamamını canlı olarak deneyin; herhangi bir pasajı yukarıya yapıştırın ve anında doğrulayın.