zerodds_py/lib.rs
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3
4//! Crate `zerodds-py`. Safety classification: **STANDARD** (Binding-FFI).
5//!
6//! PyO3-Bindings fuer ZeroDDS DCPS-API. Liefert ein importierbares
7//! Python-Modul `zerodds_py` ueber `maturin build` oder direkt via
8//! `cargo build --features extension-module`.
9//!
10//! Spec: OMG DDS 1.4 (formal/2015-04-10) §2.2.2 mit Python-Idiomen.
11//!
12//! ## Schichten-Position
13//!
14//! Layer 6 — PSMs / Bindings.
15//!
16//! ## Build
17//!
18//! - **Default-Cargo-Build** (ohne Python-Headers): pyo3 ist optional,
19//! das Crate compilet als lib-Platzhalter. Keine Python-API
20//! verfuegbar — so laeuft der Workspace-CI ohne Python-Dependency.
21//! - **Mit `--features extension-module`** (oder via `maturin build`):
22//! wird als `cdylib` kompiliert und erzeugt ein importierbares
23//! Python-Modul `zerodds_py`.
24//!
25//! ## API
26//!
27//! ```python
28//! import zerodds_py as zerodds
29//!
30//! factory = zerodds.DomainParticipantFactory.instance()
31//! participant = factory.create_participant_offline(0)
32//!
33//! topic = participant.create_bytes_topic("Chatter")
34//! publisher = participant.create_publisher()
35//! writer = publisher.create_bytes_writer(topic)
36//!
37//! subscriber = participant.create_subscriber()
38//! reader = subscriber.create_bytes_reader(topic)
39//!
40//! writer.write(b"hello")
41//! samples = reader.take() # List[bytes]
42//! ```
43//!
44//! Typisierte `DdsType`-Bindings (Dataclass-Mapping via IDL-Generator)
45//! folgen aus `crates/idl-rust` ueber Python-Bindings-Generator.
46
47#![warn(unsafe_code)]
48#![warn(missing_docs)]
49
50#[cfg(feature = "extension-module")]
51mod ffi;
52
53#[cfg(test)]
54#[allow(clippy::expect_used)]
55mod tests {
56 #[test]
57 fn dcps_re_export_compiles() {
58 // Minimaler Smoketest: zerodds-dcps ist als Dependency greifbar.
59 // Die echten PyO3-Tests laufen aus Python heraus (pytest).
60 use zerodds_dcps::DomainParticipantFactory;
61 let _f: &DomainParticipantFactory = DomainParticipantFactory::instance();
62 }
63}