Language Reference
Full syntax — every block, field, and diagnostic code
Referensi Bahasa
Referensi sintaksis lengkap untuk file Datro DSL (.dtro). Setiap jenis blok, setiap bidang, setiap kode diagnostik — semuanya di satu tempat.
Tajuk ajaib
Setiap file .dtro harus dimulai dengan header ajaib pada baris 1. Parser akan mengembalikan E100 jika hilang atau formatnya salah.
#!DATRO 1.0blok meta
Metadata tingkat dokumen opsional. Menghasilkan petunjuk info I003 jika dihilangkan. Semua bidang adalah string/array opsional kecuali 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 | — | Judul diagram yang dapat dibaca manusia |
version | string | No | — | Versi semantik dari diagram |
description | string | No | — | Deskripsi teks bebas |
author | string | No | — | Nama penulis atau email |
owner | string | No | — | Tim atau orang yang bertanggung jawab |
tags | string[] | No | — | Tag klasifikasi sewenang-wenang |
sla | string | No | — | Tujuan tingkat layanan, mis. "99.9%" |
criticality | string | No | — | Tingkat kekritisan: "P0" | "high" | "medium" | "low" |
kind | DiagramKind "architecture""mindmap""state""sequence""algorithm" | No | architecture | Varian diagram |
blok simpul
Mendeklarasikan entitas dalam diagram. Setiap node memiliki id unik, type semantik yang mengontrol bentuk yang dirender dan warna default, dan blok attrs opsional untuk metadata.
# 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 | — | Pengidentifikasi simpul unik — alfanumerik + garis bawah |
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 | Kategori simpul semantik |
label | string | No | (node id) | Tampilkan teks yang ditunjukkan pada diagram |
group | identifier | No | — | ID grup milik node ini (alternatif dari group.members) |
attrs | AttrMap | No | — | Metadata nilai kunci sewenang-wenang — string, angka, boolean, atau array |
23 jenis simpul
Semua 23 nilai: service database queue cache gateway user actor system external process storage function broker scheduler load_balancer cdn dns firewall client mobile web iot unknown.
blok tepi
Mendeklarasikan hubungan antara dua node. Arah tepi ditulis langsung dalam deklarasi: -> (terarah), <-> (dua arah), atau -- (tidak terarah).
# 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 | — | ID simpul sumber |
direction | EdgeDir "->""<->""--" | Yes | — | Jenis panah ditulis sebaris |
to | identifier | Yes | — | Id simpul target |
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 | Tipe hubungan semantik — mendorong warna dan gaya |
label | string | No | — | Teks pendek ditampilkan di garis tepi |
weight | number | No | 1.0 | Bobot lalu lintas relatif — tepi yang lebih berat membuat lebih tebal |
async | boolean | No | false | Ketika true, tepi ditampilkan sebagai garis putus-putus (api-dan-lupakan) |
attrs | AttrMap | No | — | Metadata sewenang-wenang — diteruskan ke JSON IR dan keterangan alat |
21 jenis tepi
Semua 21 nilai: http grpc graphql websocket tcp udp query event publish subscribe stream call read write deploys monitors depends extends implements triggers unknown.
blok grup
Mengelompokkan node terkait ke dalam kotak subgraf berlabel. Sebuah node dapat tergabung dalam paling banyak satu grup — E403 memicu konflik. Grup dapat disarangkan: id anggota dapat mereferensikan id grup lain.
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 | — | Pengidentifikasi grup unik |
label | string | No | (group id) | Tampilkan label untuk kotak subgraf |
members | identifier[] | No | [] | ID node atau grup yang akan disertakan — diutamakan daripada node { group: X } |
attrs | AttrMap | No | — | Metadata sewenang-wenang |
blok kendala
Mendeklarasikan aturan arsitektur yang dievaluasi validator terhadap IR. Pelanggaran menghasilkan E501 (atau W501 bila severity: warn). Bidang rule menggunakan tata bahasa tiga token yang ringkas.
# 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 | — | Pengidentifikasi aturan opsional yang dapat dibaca manusia |
rule | string | Yes | — | SUBJECT VERB OBJECT — lihat tabel kata kerja di bawah |
message | string | No | — | Pesan khusus ditampilkan dalam diagnostik ketika aturan dilanggar |
severity | ConstraintSeverity "error""warn" | No | error | Tingkat keparahan diagnostik jika dilanggar |
Kata kerja pembatas
- `!->` — tidak ada node
SUBJECTyang memiliki tepi terarah ke nodeOBJECTmana pun. - `->` — setiap node
SUBJECTharus memiliki setidaknya satu tepi yang diarahkan ke nodeOBJECT. - `!<->` — tidak ada tepi dua arah antara node
SUBJECTdanOBJECT. - `<->` — setiap node
SUBJECTharus memiliki tepi dua arah ke beberapa nodeOBJECT. - `in` — setiap node
SUBJECTharus menjadi anggota grupOBJECT. - `!in` — tidak ada node
SUBJECTyang boleh menjadi anggota grupOBJECT.
Token subjek dan objek
Setiap token dapat berupa tipe node (database, external, …), ID grup (misalnya data_tier), atau * (karakter pengganti yang cocok dengan setiap node).
blok impor
Membagi diagram besar menjadi beberapa file .dtro. Resolver menggabungkan IR yang diimpor ke induk sebelum validasi. Gunakan as untuk penspasian nama dan expose untuk memasukkan id tertentu ke daftar putih.
# 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 | — | Jalur relatif atau absolut ke file .dtro |
as | identifier | No | — | Alias namespace — semua id yang diimpor diberi awalan alias.id |
expose | identifier[] | No | — | Daftar Putih — hanya id ini yang digabungkan ke dalam IR induk |
blok tata letak
Petunjuk kepada penyaji tentang cara menyusun grafik. Semua bidang bersifat opsional — penyaji menggunakan default yang masuk akal ketika blok dihilangkan.
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 | Arah aliran grafik |
algo | LayoutAlgo "dagre""dot""elk""force""none" | No | dagre | Algoritma tata letak |
node_sep | number | No | 60 | Piksel minimum antara node yang berdekatan dalam peringkat yang sama |
rank_sep | number | No | 120 | Piksel minimum antar peringkat |
margin | number | No | 20 | Margin grafik dalam piksel |
cluster_padding | number | No | 16 | Bantalan ekstra di dalam kotak pembatas grup |
blok tema
Mengontrol tampilan visual diagram yang dirender. palette memetakan tipe node ke warna hex. Sub-blok accessibility mengaktifkan pemeriksaan kontras WCAG 2.1 otomatis.
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
}
}Warna font otomatis
Eksportir DOT secara otomatis memilih teks hitam atau putih untuk setiap pengisian node menggunakan rumus pencahayaan relatif WCAG 2.1. Anda tidak perlu mengatur warna teks terpisah.
blok gaya
Penggantian per elemen secara mendetail diterapkan setelah tema. Aturan berjenjang: by_id mengesampingkan by_type. Setiap sub-blok memetakan kunci ke peta properti.
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 | — | Gaya diterapkan ke semua node dari tipe tertentu |
by_id | Record<id, StyleProps> | No | — | Gaya diterapkan ke id simpul tertentu — prioritas tertinggi |
by_edge_kind | Record<EdgeKind, StyleProps> | No | — | Gaya diterapkan ke semua sisi dari jenis tertentu |
by_edge_attr | Record<attrName, StyleProps> | No | — | Gaya diterapkan ke tepi yang nama boolean attrnya adalah true |
Kode diagnostik
Semua diagnostik mencakup lokasi code, severity, message, dan line:col opsional. Tabel di bawah mencantumkan setiap kode yang dapat dikeluarkan oleh rantai alat.
Kesalahan (E×××)
- `E100` — Header ajaib
#!DATRO 1.0hilang atau formatnya salah - `E201` — ID simpul duplikat
- `E202` — Node mereferensikan id grup yang tidak diketahui
- `E301` — Node tepi
fromtidak ditemukan - `E302` — Node tepi
totidak ditemukan - `E303` — Tepi
weightnegatif - `E401` — ID grup duplikat
- `E402` — Grup
membersmereferensikan id yang tidak diketahui - `E403` — Node ditugaskan ke lebih dari satu grup
- `E404` — Kumpulan kelompok melingkar terdeteksi
- `E500` — Aturan batasan mengalami kesalahan sintaksis
- `E501` — Aturan batasan dilanggar (keparahan mencerminkan
severitybatasan itu sendiri)
Peringatan (L×××)
- `W301` — Tepi duplikat (sama dari/ke/jenis/label)
- `W501` — Aturan batasan menggunakan kata kerja yang tidak diketahui
- `W601` — Label simpul melebihi
max_label_length(default 80 karakter) - `W602` — Warna palet tema berada di bawah kontras WCAG AA (4,5:1)
- `W603` — Warna palet tema berada di bawah kontras WCAG AAA (7,0:1)
Petunjuk info (I×××)
- `I001` — Node terisolasi — tidak ada edge yang terhubung dengannya
- `I002` — Grup kosong — tidak ada anggota yang diumumkan
- `I003` — Tidak ada blok
meta— direkomendasikan untuk dokumentasi - `I601` — Tidak ada palet tema yang ditentukan — pemeriksaan kontras dilewati
Langkah selanjutnya
- Gunakan CLI Reference untuk memvalidasi, memformat, dan mengekspor dari baris perintah.
- Sematkan diagram di Markdown dengan Markdown plugin.
- Kembali ke Quick Start untuk panduan langkah demi langkah.
Coba bahasa lengkapnya secara langsung — tempelkan cuplikan apa pun di atas dan validasi secara instan.