zerodds_rs/lib.rs
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3//
4//! Crate `zerodds-rs`. Safety classification: **SAFE**.
5//!
6//! `zerodds-rs` — idiomatische Rust-SDK-Facade.
7//!
8//! Re-exportiert die nutzerseitig relevanten APIs aus den darunterliegenden
9//! Implementierungs-Crates (`zerodds-dcps`, `zerodds-dcps-async`,
10//! `zerodds-qos`, `zerodds-types`, `zerodds-monitor`, `zerodds-recorder`).
11//!
12//! Anwendungen sollten **diese** Crate nutzen — direkter Zugriff auf
13//! `zerodds-dcps` etc. ist erlaubt, aber an `zerodds-rs` muss sich die
14//! Public-API stabilisieren.
15//!
16//! # Beispiel
17//!
18//! ```no_run
19//! use zerodds_rs::{
20//! DomainParticipantFactory, DomainParticipantQos, RawBytes, TopicQos,
21//! PublisherQos, SubscriberQos, DataWriterQos, DataReaderQos,
22//! };
23//!
24//! let f = DomainParticipantFactory::instance();
25//! let dp = f.create_participant_offline(0, DomainParticipantQos::default());
26//! let topic = dp.create_topic::<RawBytes>("Chatter", TopicQos::default()).unwrap();
27//! let publisher = dp.create_publisher(PublisherQos::default());
28//! let writer = publisher
29//! .create_datawriter::<RawBytes>(&topic, DataWriterQos::default())
30//! .unwrap();
31//! let _ = writer; // offline-Mode hat kein UDP — nur API-Smoke.
32//! ```
33//!
34//! ## Re-Exports
35//!
36//! - **[`crate::dcps`]** — synchrone DCPS-Surface (`zerodds_dcps::*`).
37//! - **[`crate::aio`]** — async DCPS (`zerodds_dcps_async::*`).
38//! - **[`crate::qos`]** — alle 22 QoS-Policies (`zerodds_qos::*`).
39//! - **[`crate::types`]** — IDL-/XTypes-Typsystem (`zerodds_types::*`).
40//! - **[`crate::monitor`]** — Statistics + Built-in DCPS-Monitor.
41//! - **[`crate::recorder`]** — Sample-Recording + -Replay.
42//!
43//! Plus Top-Level-Convenience-Re-Exports der haeufigsten Symbole.
44
45#![deny(unsafe_code)]
46#![warn(missing_docs)]
47
48/// Sync DCPS-API (`zerodds_dcps`).
49pub use zerodds_dcps as dcps;
50
51/// Async DCPS-API (`zerodds_dcps_async`).
52pub use zerodds_dcps_async as aio;
53
54/// QoS-Policies (`zerodds_qos`).
55pub use zerodds_qos as qos;
56
57/// IDL-/XTypes-Typsystem (`zerodds_types`).
58pub use zerodds_types as types;
59
60/// DCPS-Monitor (`zerodds_monitor`).
61pub use zerodds_monitor as monitor;
62
63/// Sample-Recording (`zerodds_recorder`).
64pub use zerodds_recorder as recorder;
65
66/// Foundation-Layer (Time-Service, Observability) (`zerodds_foundation`).
67pub use zerodds_foundation as foundation;
68
69// ---- Top-Level Convenience Re-Exports -------------------------------------
70
71pub use zerodds_dcps::{
72 DataReader, DataReaderQos, DataWriter, DataWriterQos, DdsError, DomainParticipant,
73 DomainParticipantFactory, DomainParticipantQos, Publisher, PublisherQos, RawBytes, Result,
74 Subscriber, SubscriberQos, Topic, TopicQos,
75};
76
77pub use zerodds_dcps::dds_type::DdsType;
78pub use zerodds_dcps::instance_handle::InstanceHandle;
79
80pub use zerodds_qos::Duration;
81
82#[cfg(test)]
83mod tests {
84 use super::*;
85
86 #[test]
87 fn factory_singleton_returns_stable_ref() {
88 let f1 = DomainParticipantFactory::instance() as *const _;
89 let f2 = DomainParticipantFactory::instance() as *const _;
90 assert_eq!(f1, f2);
91 }
92
93 #[test]
94 fn participant_offline_create_topic() {
95 let f = DomainParticipantFactory::instance();
96 let dp = f.create_participant_offline(7, DomainParticipantQos::default());
97 let t = dp.create_topic::<RawBytes>("X", TopicQos::default());
98 assert!(t.is_ok());
99 }
100
101 #[test]
102 fn re_exports_resolve() {
103 // QoS-Re-Export.
104 let _ = Duration::from_millis(500);
105 // Async-Re-Export ist erreichbar (Modulpfad).
106 let _: &str = stringify!(aio::AsyncDomainParticipantFactory);
107 }
108}