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.97.1, Edition 2024 via rust-toolchain.toml. Layer-N crates may depend only on layers 0 .. N-1; cycles are detected by cargo run -p zerodds-lint -- check. No [workspace.dependencies] table — each crate manages its own dependency versions.
rc.1 Definition-of-Done
For 1.0.0-rc.1, every crate had to pass 13 checks before its tracker entry flipped to ✅ rc1-ready:
- 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 per crate
- 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/wire/(zerodds-wire): the writers and readers the generated codecs call; the codecs themselves come fromzerodds-lang-rules. 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 were blockers for rc.1; 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
- Put the publishable crates into publish order:
cargo run -p zerodds-cargo-dag -- . --only-publishable. - Green CI on
main: clippy, fmt, test, zerodds-lint, cargo-deny. - Tag
v1.0.0-rc.7on the workspace. - Push
github/tree togithub.com/zero-objects/zero-dds. - Publish to crates.io in DAG order.
- Build packaging artifacts (
.deb,.rpm, MSI, macOS.pkg,.tar.xz/.ziparchives, Docker images). - 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.97.1, Edition 2024. Layer-N-Crates dürfen nur von den Schichten 0 .. N-1 abhängen; Zyklen erkennt cargo run -p zerodds-lint -- check. Keine [workspace.dependencies]-Tabelle — jede Crate verwaltet ihre eigenen Dependency-Versionen.
rc.1-Definition-of-Done
Für 1.0.0-rc.1 musste jede Crate 13 Checks erfüllen, bevor ihr Tracker-Eintrag auf ✅ rc1-ready sprang:
- 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 pro Crate
- 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/wire/(zerodds-wire): die Writer und Reader, die die erzeugten Codecs aufrufen; die Codecs selbst kommen auszerodds-lang-rules. 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 waren Blocker für rc.1; 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
- Die veröffentlichbaren Crates in Publish-Reihenfolge bringen:
cargo run -p zerodds-cargo-dag -- . --only-publishable. - Grüne CI auf
main: clippy, fmt, test, zerodds-lint, cargo-deny. v1.0.0-rc.7auf dem Workspace taggen.github/-Baum nachgithub.com/zero-objects/zero-ddspushen.- In DAG-Reihenfolge auf crates.io publishen.
- Packaging-Artefakte bauen (
.deb,.rpm, MSI, macOS-.pkg,.tar.xz-/.zip-Archive, Docker-Images). website/nachzerodds.orgdeployen.