Skip to main content

zerodds_rpc/
lib.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3
4//! Crate `zerodds-rpc`. Safety classification: **STANDARD**.
5//!
6//! DDS-RPC 1.0 (OMG `formal/16-12-04`) Request/Reply-Framework auf
7//! dem ZeroDDS-DCPS-Stack.
8//!
9//! ## Schichten-Position
10//!
11//! Layer 4 — Core Services. Baut auf `zerodds-dcps` (DataWriter/
12//! DataReader) + `zerodds-idl` (IDL-AST) + `zerodds-qos` (DDS-QoS) +
13//! `zerodds-xml` (Profile-Loader).
14//!
15//! ## Public API (Stand 1.0.0-rc.1)
16//!
17//! **Foundation (Spec §7.3-§7.5):**
18//! * [`common_types`] — `RequestHeader`, `ReplyHeader`, `SampleIdentity`,
19//!   `RemoteExceptionCode_t` (Spec §7.5.1.1.1) mit XCDR2-Encode/Decode.
20//! * [`topic_naming`] — Topic-Naming-Konvention `<Service>_Request` /
21//!   `<Service>_Reply` (Spec §7.8.2) plus Service-Name-Validation.
22//! * [`annotations`] — Lowering der RPC-IDL-Annotations `@service`,
23//!   `@oneway`, `@in`, `@out`, `@inout` (Spec §7.3).
24//! * [`service_mapping`] — Datenmodell-Lowering einer IDL-Service-
25//!   Definition zu `ServiceDef`/`MethodDef`/`ParamDef` (Spec §7.4).
26//! * [`codegen`] — Request/Reply-Struct-Pairs (Basic + Enhanced) +
27//!   `CallUnion` (Spec §7.5.1).
28//! * [`rpc_hash`] — `rpc_member_hash` fuer Spec-§7.5.4 Member-Hash.
29//!
30//! **Runtime (Spec §7.9-§7.11):**
31//! * [`requester`] — `Requester<TIn, TOut>`: Request senden, Reply via
32//!   `SampleIdentity`-Korrelation, blocking + tick-driven API.
33//! * [`replier`] — `Replier<TIn, TOut>` inkl. `ReplierHandler`-Trait +
34//!   `FnHandler`-Adapter.
35//! * [`qos_profile`] — `RpcQos` mit Spec-Defaults + XML-Profile-
36//!   Resolution gegen `zerodds-xml::DdsXml`.
37//! * [`wire_codec`] — Encoder/Decoder fuer Request- und Reply-Frames
38//!   (Header XCDR2 + User-Payload).
39//! * [`endpoint`] — `RpcEndpointBuilder` als Convenience-Konstruktor.
40//!
41//! **Cross-Cutting (Spec §7.6-§7.8):**
42//! * [`discovery_ext`] — `PublicationBuiltinTopicDataExt` + Service-Match-Logik.
43//! * [`function_call`] — `FunctionStub` / `FunctionSkeleton` /
44//!   `dispatch_request` (Spec §7.7).
45//! * [`evolution_rules`] — Compatibility-Mappings (Spec §7.6.5).
46//! * [`request_identity`] — `RequestIdentity` (Spec-Layer-Wrapper).
47//!
48//! ## Beispiel
49//!
50//! ```rust,ignore
51//! use zerodds_rpc::{Requester, RpcEndpointBuilder};
52//! // ... siehe README.md fuer ein vollstaendiges Quickstart-Beispiel.
53//! ```
54
55#![cfg_attr(not(feature = "std"), no_std)]
56#![deny(unsafe_code)]
57#![warn(missing_docs)]
58#![allow(clippy::missing_errors_doc)]
59
60extern crate alloc;
61
62pub mod annotations;
63pub mod codegen;
64pub mod common_types;
65pub mod discovery_ext;
66pub mod endpoint;
67pub mod error;
68pub mod evolution_rules;
69pub mod function_call;
70#[cfg(feature = "std")]
71pub mod qos_profile;
72#[cfg(feature = "std")]
73pub mod replier;
74pub mod request_identity;
75#[cfg(feature = "std")]
76pub mod requester;
77pub mod rpc_hash;
78pub mod service_mapping;
79pub mod topic_naming;
80pub mod wire_codec;
81
82pub use annotations::{LoweredRpc, RpcAnnotation, lower_rpc_annotations};
83pub use codegen::{
84    CallUnionCase, CallUnionDef, MemberType, MethodPair, ReplyType, RequestType, ServiceLayout,
85    StructMember, build_basic_pair, build_enhanced_all, build_enhanced_pair,
86};
87pub use common_types::{
88    MAX_HEADER_BYTES, MAX_STRING_LEN, RemoteExceptionCode, ReplyHeader, RequestHeader,
89    SampleIdentity,
90};
91pub use discovery_ext::{
92    PublicationBuiltinTopicDataExt, ServiceMappingProfile, SubscriptionBuiltinTopicDataExt,
93    client_matches_service, service_matches_client,
94};
95pub use endpoint::{ReplierEndpoint, RequesterEndpoint, RpcEndpointBuilder};
96pub use error::{RpcError, RpcResult};
97pub use evolution_rules::{Evolution, Mapping, compatible_evolutions, is_compatible};
98pub use function_call::{
99    FunctionSkeleton, FunctionStub, OperationDescriptor, ServiceDescriptor, dispatch_request,
100};
101pub use request_identity::RequestIdentity;
102pub use rpc_hash::rpc_member_hash;
103pub use service_mapping::{
104    MethodDef, ParamDef, ParamDirection, ServiceDef, TypeRef, lower_service,
105};
106pub use topic_naming::{
107    REPLY_SUFFIX, REQUEST_SUFFIX, ServiceTopicNames, reply_topic_name, request_topic_name,
108    validate_service_name,
109};
110
111#[cfg(test)]
112mod tests {
113    #[test]
114    fn crate_compiles() {
115        // Smoke-Test: Crate kompiliert und Testharness laeuft.
116    }
117}