zerodds_rpc/request_identity.rs
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3
4//! Request-Identity-Propagation (Spec §7.8.2.x).
5//!
6//! Service- und Client-Side koennen die Identitaet eines Requests
7//! abfragen via `get_request_identity()`. Wir liefern das via
8//! [`RequestIdentity`]-Struct, das vom Replier/Requester-Pfad
9//! gefuellt wird.
10//!
11//! # Spec-Mapping
12//!
13//! * **§7.8.2.1** Service-Side `get_request_identity()` —
14//! `current_request_identity` (siehe Replier-Modul) auf Replier-Seite.
15//! * **§7.8.2.2** Client-Side `get_request_identity()` —
16//! `RequesterEndpoint`-Pfad.
17//! * **§7.8.2.3** Propagation via Inline-QoS
18//! (`PID_RELATED_SAMPLE_IDENTITY`) — siehe `zerodds-rtps`-Wire-Pfad.
19
20extern crate alloc;
21
22use crate::common_types::SampleIdentity;
23
24/// Spec §7.8.2.1 + §7.8.2.2: Identitaet eines aktiven Requests.
25#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
26pub struct RequestIdentity {
27 /// SampleIdentity des Requests.
28 pub sample_identity: SampleIdentity,
29 /// `true` wenn die Identitaet via Inline-QoS propagiert wurde
30 /// (Spec §7.8.2.3); `false` bei Header-basierter Propagation.
31 pub via_inline_qos: bool,
32}
33
34impl RequestIdentity {
35 /// Konstruktor fuer Header-basierte Propagation.
36 #[must_use]
37 pub fn from_header(sample_identity: SampleIdentity) -> Self {
38 Self {
39 sample_identity,
40 via_inline_qos: false,
41 }
42 }
43
44 /// Konstruktor fuer Inline-QoS-basierte Propagation.
45 #[must_use]
46 pub fn from_inline_qos(sample_identity: SampleIdentity) -> Self {
47 Self {
48 sample_identity,
49 via_inline_qos: true,
50 }
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57
58 #[test]
59 fn from_header_marks_explicit_propagation() {
60 let id = SampleIdentity::default();
61 let r = RequestIdentity::from_header(id);
62 assert!(!r.via_inline_qos);
63 assert_eq!(r.sample_identity, id);
64 }
65
66 #[test]
67 fn from_inline_qos_marks_implicit_propagation() {
68 let id = SampleIdentity::default();
69 let r = RequestIdentity::from_inline_qos(id);
70 assert!(r.via_inline_qos);
71 assert_eq!(r.sample_identity, id);
72 }
73
74 #[test]
75 fn default_is_header_based_with_zero_identity() {
76 let r = RequestIdentity::default();
77 assert!(!r.via_inline_qos);
78 }
79}