zerodds_mqtt_bridge/lib.rs
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3
4//! Crate `zerodds-mqtt-bridge`. Safety classification: **STANDARD**.
5//!
6//! MQTT v5.0 (OASIS Standard 07 March 2019) Wire-Codec + Broker +
7//! DDS-Bridge — pure-Rust `no_std + alloc`, `forbid(unsafe_code)`.
8//! Implementiert die volle MQTT-5.0-Spec inkl. aller Control-Packet-
9//! Bodies (CONNECT / CONNACK / PUBLISH / PUBACK / PUBREC / PUBREL /
10//! PUBCOMP / SUBSCRIBE / SUBACK / UNSUBSCRIBE / UNSUBACK / PINGREQ /
11//! PINGRESP / DISCONNECT / AUTH), aller Properties (§2.2.2),
12//! Keep-Alive-Tracker (§3.1.2.10), Topic-Filter-Matching mit
13//! Wildcards (§4.7), In-Memory-Broker mit Session-State + Retained-
14//! Messages + Will-Messages, und einen MQTT↔DDS-Topic-Bridge.
15//!
16//! Spec: OASIS MQTT 5.0 §1 (Introduction), §1.5 (Data Types), §2
17//! (MQTT Control Packet Format), §3 (MQTT Control Packets), §4
18//! (Operational Behavior).
19//!
20//! ## Schichten-Position
21//!
22//! Layer 5 — Bridges. Substrat fuer DDS↔MQTT-Endpoint-Mapping
23//! (IoT-Broker-Integration, Cloud-MQTT-Endpoints).
24//!
25//! ## Public API (Stand 1.0.0-rc.1)
26//!
27//! - [`FixedHeader`] / [`ControlPacketType`] — §2.1.
28//! - [`encode_publish`] / [`decode_publish`] / [`CodecError`] —
29//! PUBLISH-Codec (§3.3).
30//! - Encoder/Decoder fuer alle 14 Control-Packet-Bodies — siehe
31//! [`control_packets`].
32//! - [`Property`] / [`PropertyId`] / [`PropertyValueKind`] /
33//! [`PropertyDataType`] — §2.2.2.
34//! - [`encode_vbi`] / [`decode_vbi`] / [`vbi_size`] — Variable Byte
35//! Integer (§1.5.5).
36//! - [`encode_utf8_string`] / [`decode_utf8_string`] /
37//! [`encode_binary_data`] / [`decode_binary_data`] /
38//! [`encode_two_byte_int`] / [`decode_two_byte_int`] — Data Types
39//! §1.5.
40//! - [`Broker`] / [`Session`] / [`BrokerSubscription`] /
41//! [`RetainedMessage`] / [`DeliveryEnvelope`] / [`Will`] / [`QoS`]
42//! — Broker-Logic (§3 + §4).
43//! - [`KeepAliveTracker`] — §3.1.2.10.
44//! - [`ReasonCode`] — §2.4.
45//! - [`topic_matches`] / [`validate_filter`] / [`validate_topic_name`]
46//! / [`TopicFilterError`] — Topic-Filter-Matching (§4.7).
47//! - [`MqttDdsBridge`] / [`TopicMapper`] / [`BridgeStats`] /
48//! [`DdsDurability`] / [`DdsReliability`] / [`mqtt_qos_to_dds`] /
49//! [`dds_qos_to_mqtt`] / [`forward_user_properties`] —
50//! MQTT↔DDS-Topic-Mapping.
51//!
52//! ## Beispiel
53//!
54//! ```rust
55//! use zerodds_mqtt_bridge::{encode_vbi, decode_vbi};
56//!
57//! let buf = encode_vbi(268_435_455).expect("encode max VBI");
58//! let (v, consumed) = decode_vbi(&buf).expect("decode");
59//! assert_eq!(v, 268_435_455);
60//! assert_eq!(consumed, 4);
61//! ```
62
63#![forbid(unsafe_code)]
64#![warn(missing_docs)]
65#![allow(
66 clippy::expect_used,
67 clippy::unwrap_used,
68 clippy::panic,
69 clippy::print_stderr,
70 clippy::print_stdout,
71 clippy::field_reassign_with_default,
72 clippy::manual_flatten,
73 clippy::collapsible_if,
74 clippy::empty_line_after_doc_comments,
75 clippy::approx_constant,
76 clippy::unreachable,
77 clippy::uninlined_format_args,
78 clippy::drop_non_drop,
79 clippy::useless_conversion,
80 clippy::manual_strip,
81 missing_docs
82)]
83
84extern crate alloc;
85
86pub mod codec;
87pub mod control_packets;
88pub mod data_types;
89pub mod packet;
90pub mod properties;
91pub mod vbi;
92
93pub use codec::{CodecError, decode_publish, encode_publish};
94pub use control_packets::{
95 AckBody, AuthBody, ConnackBody, ConnectBody, DisconnectBody, PropertyDataType, SubackBody,
96 SubscribeBody, Subscription, UnsubackBody, UnsubscribeBody, decode_ack_body, decode_auth_body,
97 decode_connack_body, decode_connect_body, decode_disconnect_body, decode_suback_body,
98 decode_subscribe_body, decode_unsuback_body, decode_unsubscribe_body, encode_ack_body,
99 encode_auth_body, encode_connack_body, encode_connect_body, encode_disconnect_body,
100 encode_suback_body, encode_subscribe_body, encode_unsuback_body, encode_unsubscribe_body,
101 property_data_type,
102};
103pub use data_types::{
104 decode_binary_data, decode_two_byte_int, decode_utf8_string, encode_binary_data,
105 encode_two_byte_int, encode_utf8_string,
106};
107pub use packet::{ControlPacketType, FixedHeader};
108pub use properties::{Property, PropertyId, PropertyValueKind};
109pub use vbi::{decode_vbi, encode_vbi, vbi_size};
110
111pub mod broker;
112#[cfg(feature = "daemon")]
113pub mod daemon;
114pub mod dds_bridge;
115pub mod keep_alive;
116pub mod reason_codes;
117pub mod topic_filter;
118
119pub use broker::{
120 Broker, DeliveryEnvelope, QoS, RetainedMessage, Session, Subscription as BrokerSubscription,
121 Will,
122};
123pub use dds_bridge::{
124 BridgeStats, DdsDurability, DdsReliability, MqttDdsBridge, TopicMapper, dds_qos_to_mqtt,
125 forward_user_properties, mqtt_qos_to_dds,
126};
127pub use keep_alive::KeepAliveTracker;
128pub use reason_codes::ReasonCode;
129pub use topic_filter::{
130 TopicFilterError, matches as topic_matches, validate_filter, validate_topic_name,
131};