Developer Guide
For contributors working on the ZeroDDS codebase. Eight-section condensed handbook.
Codebase Tour
Single Cargo workspace, ~95 crates organised in nine layers:
| Layer | Topic | Crate count |
|---|---|---|
| 0 | Foundation (errors, time, monitor, observability, flatdata) | 8 |
| 1 | Transport (UDP, TCP, SHM, TSN) | 5 |
| 2 | Wire Protocol (RTPS, discovery, builtin-topics) | 6 |
| 3 | Core Services (DCPS, QoS, security, types, sql-filter) | 12 |
| 4 | Schema (CDR, IDL, per-language code generators) | 8 |
| 5 | Protocol Bridges (WS / MQTT / CoAP / AMQP / gRPC / CORBA + bridge-security) | 10 |
| 6 | Language Bindings (C / C++ / C# / Java / Python / TS / Flutter) | 11 |
| 7 | Bridging Services (ROS-2 RMW, DLRL, OPC-UA, XRCE, web, soap) | 11 |
| 8 | CORBA + CCM (full OMG CORBA 3.3 + DDS4CCM 1.1 stack) | 17 |
Cargo + MSRV
Workspace pins to Rust 1.88.0, Edition 2024 via rust-toolchain.toml. Layer-N crates may depend only on layers 0 .. N-1; cycles are detected by cargo run -p dds-lint -- check. No [workspace.dependencies] table — each crate manages its own dependency versions.
RC1 Definition-of-Done
Every crate must satisfy 13 checks before its tracker entry flips to ✅ rc1-ready. See RC1_GUARDRAILS.md:
- Cargo.toml metadata complete
lib.rs/main.rsheader with safety class + spec refREADME.mdCHANGELOG.md- Public-API audit
- Coherence audit (CONNECTED / TEST-ONLY / DEAD)
- Spec-coverage doc updated
- Forbidden-token sweep
- SPDX license headers per file
- Tests + lints + doc build green
- Review doc under
docs/release/rc1-reviews/ - Tracker entry
✅ rc1-ready - Public mirror under
github/+website/
Wire-Format Conventions
Two contracts:
- RTPS 2.5 —
crates/rtps/. Wire bytes verified against Cyclone DDS captures. Cross-vendor fixtures undercrates/discovery/tests/fixtures/cyclone-xcdr2/. - XCDR1 / XCDR2 —
crates/cdr/. Encoder + decoder for all primitive types, sequences, optionals, maps, unions, mutable structs (DHEADER + EMHEADER + PID), bitmasks. See the CDR Wire-Format Handbook.
Test Categories
- Unit — in
#[cfg(test)] mod testsalongside source. - Integration — in
tests/per crate. - Cross-vendor — gated behind
#[ignore], run against external broker / DDS implementations in CI lab. - Fuzz —
cargo fuzzharnesses infuzz/per protocol crate. - End-to-end —
tests/interop/with docker-compose for mosquitto / RabbitMQ / libcoap / omniORB / grpcurl / ros2-cyclone.
Spec-Coverage Workflow
Each OMG spec has a coverage doc under docs/spec-coverage/<spec>.md. Per section: Status ∈ {done, partial, open, n/a (informative), n/a (rejected)}, Repo link to source, Tests link to test functions. partial + open are RC1 blockers; n/a (rejected) needs an ADR under docs/adr/.
Public-Mirror Sync
Three trees in one repository:
./— internal development tree, may contain internal hostnames, sprint markers.github/— public mirror after forbidden-token sweep. This is what gets pushed togithub.com/zero-objects/zero-dds.website/— Public landing pages, manuals, claims, commercial. Deployed tozerodds.org.
The forbidden-token sweep runs in CI. Anything in github/ or website/ matching the forbidden list (internal hostnames, WP X.Y.Z sprint markers, etc.) blocks the merge.
Release Process
- Audit all 90+ crates via
cargo run -p tools/cargo-dagfor publish-order. - Green CI on
main: clippy, fmt, test, dds-lint, cargo-deny. - Tag
1.0.0-rc.3on the workspace + per-crate tags. - Push
github/tree togithub.com/zero-objects/zero-dds. - Publish to crates.io in DAG order.
- Build packaging artifacts (
.deb,.rpm, AppImage, Homebrew, MSI, Docker). - Deploy
website/tozerodds.org.
Developer Guide
Für Contributor, die am ZeroDDS-Codebase arbeiten. Kompaktes Handbuch in acht Abschnitten.
Codebase-Tour
Ein einzelner Cargo-Workspace, ~95 Crates in neun Schichten organisiert:
| Schicht | Thema | Crate-Anzahl |
|---|---|---|
| 0 | Foundation (Errors, Time, Monitor, Observability, flatdata) | 8 |
| 1 | Transport (UDP, TCP, SHM, TSN) | 5 |
| 2 | Wire-Protokoll (RTPS, Discovery, Builtin-Topics) | 6 |
| 3 | Core-Services (DCPS, QoS, Security, Types, sql-filter) | 12 |
| 4 | Schema (CDR, IDL, Sprach-Codegeneratoren) | 8 |
| 5 | Protokoll-Bridges (WS / MQTT / CoAP / AMQP / gRPC / CORBA + bridge-security) | 10 |
| 6 | Sprach-Bindings (C / C++ / C# / Java / Python / TS / Flutter) | 11 |
| 7 | Bridging-Services (ROS-2 RMW, DLRL, OPC-UA, XRCE, web, soap) | 11 |
| 8 | CORBA + CCM (voller OMG-CORBA-3.3- + DDS4CCM-1.1-Stack) | 17 |
Cargo + MSRV
Der Workspace pinnt via rust-toolchain.toml auf Rust 1.88.0, Edition 2024. Layer-N-Crates dürfen nur von den Schichten 0 .. N-1 abhängen; Zyklen erkennt cargo run -p dds-lint -- check. Keine [workspace.dependencies]-Tabelle — jede Crate verwaltet ihre eigenen Dependency-Versionen.
RC1-Definition-of-Done
Jede Crate muss 13 Checks erfüllen, bevor ihr Tracker-Eintrag auf ✅ rc1-ready springt. Siehe RC1_GUARDRAILS.md:
- Cargo.toml-Metadaten vollständig
lib.rs/main.rs-Header mit Safety-Klasse + Spec-RefREADME.mdCHANGELOG.md- Public-API-Audit
- Kohärenz-Audit (CONNECTED / TEST-ONLY / DEAD)
- Spec-Coverage-Doc aktualisiert
- Forbidden-Token-Sweep
- SPDX-Lizenz-Header pro Datei
- Tests + Lints + Doc-Build grün
- Review-Doc unter
docs/release/rc1-reviews/ - Tracker-Eintrag
✅ rc1-ready - Public-Mirror unter
github/+website/
Wire-Format-Konventionen
Zwei Verträge:
- RTPS 2.5 —
crates/rtps/. Wire-Bytes gegen Cyclone-DDS-Captures verifiziert. Cross-Vendor-Fixtures untercrates/discovery/tests/fixtures/cyclone-xcdr2/. - XCDR1 / XCDR2 —
crates/cdr/. Encoder + Decoder für alle primitiven Typen, Sequences, Optionals, Maps, Unions, mutable Structs (DHEADER + EMHEADER + PID), Bitmasks. Siehe das CDR-Wire-Format-Handbuch.
Test-Kategorien
- Unit — in
#[cfg(test)] mod testsneben dem Source. - Integration — in
tests/pro Crate. - Cross-Vendor — hinter
#[ignore]gegated, laufen gegen externe Broker / DDS-Implementierungen im CI-Lab. - Fuzz —
cargo fuzz-Harnesses infuzz/pro Protokoll-Crate. - End-to-End —
tests/interop/mit docker-compose für mosquitto / RabbitMQ / libcoap / omniORB / grpcurl / ros2-cyclone.
Spec-Coverage-Workflow
Jede OMG-Spec hat ein Coverage-Doc unter docs/spec-coverage/<spec>.md. Pro Sektion: Status ∈ {done, partial, open, n/a (informative), n/a (rejected)}, Repo-Link zur Quelle, Tests-Link zu den Test-Funktionen. partial + open sind RC1-Blocker; n/a (rejected) braucht ein ADR unter docs/adr/.
Public-Mirror-Sync
Drei Bäume in einem Repository:
./— interner Entwicklungs-Baum, darf interne Hostnamen und Sprint-Marker enthalten.github/— Public-Mirror nach dem Forbidden-Token-Sweep. Das wird nachgithub.com/zero-objects/zero-ddsgepusht.website/— öffentliche Landing-Pages, Manuals, Claims, Commercial. Deployed nachzerodds.org.
Der Forbidden-Token-Sweep läuft in der CI. Alles in github/ oder website/, das auf der Forbidden-Liste matcht (interne Hostnamen, WP X.Y.Z-Sprint-Marker etc.), blockiert den Merge.
Release-Prozess
- Alle 90+ Crates via
cargo run -p tools/cargo-dagauf Publish-Reihenfolge auditieren. - Grüne CI auf
main: clippy, fmt, test, dds-lint, cargo-deny. 1.0.0-rc.3auf dem Workspace + per-Crate-Tags taggen.github/-Baum nachgithub.com/zero-objects/zero-ddspushen.- In DAG-Reihenfolge auf crates.io publishen.
- Packaging-Artefakte bauen (
.deb,.rpm, AppImage, Homebrew, MSI, Docker). website/nachzerodds.orgdeployen.