Skip to main content

zerodds_qos/policies/
data_lifecycle.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3//! Reader/Writer DataLifecycle (DDS 1.4 §2.2.3.20, §2.2.3.21).
4//!
5//! Wire-Format:
6//! - `WriterDataLifecycle`: bool autodispose (4 byte mit Padding).
7//! - `ReaderDataLifecycle`: 2 × Duration (16 byte).
8
9use zerodds_cdr::{BufferReader, BufferWriter, DecodeError, EncodeError};
10
11use crate::duration::Duration;
12use crate::wire_helpers::{read_bool_padded, write_bool_padded};
13
14/// WriterDataLifecycleQosPolicy.
15#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub struct WriterDataLifecycleQosPolicy {
17    /// Ob Autodispose bei unregister_instance. Default: `true`.
18    pub autodispose_unregistered_instances: bool,
19}
20
21impl Default for WriterDataLifecycleQosPolicy {
22    fn default() -> Self {
23        Self {
24            autodispose_unregistered_instances: true,
25        }
26    }
27}
28
29impl WriterDataLifecycleQosPolicy {
30    /// Wire-Encoding (1 bool + 3 pad = 4 byte).
31    ///
32    /// # Errors
33    /// Buffer-Overflow.
34    pub fn encode_into(self, w: &mut BufferWriter) -> Result<(), EncodeError> {
35        write_bool_padded(w, self.autodispose_unregistered_instances)
36    }
37
38    /// Wire-Decoding.
39    ///
40    /// # Errors
41    /// Buffer-Underflow.
42    pub fn decode_from(r: &mut BufferReader<'_>) -> Result<Self, DecodeError> {
43        Ok(Self {
44            autodispose_unregistered_instances: read_bool_padded(r)?,
45        })
46    }
47}
48
49/// ReaderDataLifecycleQosPolicy.
50#[derive(Debug, Clone, Copy, PartialEq, Eq)]
51pub struct ReaderDataLifecycleQosPolicy {
52    /// Autopurge NotAlive-no-Writers.
53    pub autopurge_nowriter_samples_delay: Duration,
54    /// Autopurge Disposed-Samples.
55    pub autopurge_disposed_samples_delay: Duration,
56}
57
58impl Default for ReaderDataLifecycleQosPolicy {
59    fn default() -> Self {
60        Self {
61            autopurge_nowriter_samples_delay: Duration::INFINITE,
62            autopurge_disposed_samples_delay: Duration::INFINITE,
63        }
64    }
65}
66
67impl ReaderDataLifecycleQosPolicy {
68    /// Wire-Encoding (2 × Duration = 16 byte).
69    ///
70    /// # Errors
71    /// Buffer-Overflow.
72    pub fn encode_into(self, w: &mut BufferWriter) -> Result<(), EncodeError> {
73        self.autopurge_nowriter_samples_delay.encode_into(w)?;
74        self.autopurge_disposed_samples_delay.encode_into(w)
75    }
76
77    /// Wire-Decoding.
78    ///
79    /// # Errors
80    /// Buffer-Underflow.
81    pub fn decode_from(r: &mut BufferReader<'_>) -> Result<Self, DecodeError> {
82        let nowriter = Duration::decode_from(r)?;
83        let disposed = Duration::decode_from(r)?;
84        Ok(Self {
85            autopurge_nowriter_samples_delay: nowriter,
86            autopurge_disposed_samples_delay: disposed,
87        })
88    }
89}
90
91#[cfg(test)]
92#[allow(clippy::unwrap_used)]
93mod tests {
94    use super::*;
95    use zerodds_cdr::Endianness;
96
97    #[test]
98    fn writer_default_is_autodispose_true() {
99        assert!(WriterDataLifecycleQosPolicy::default().autodispose_unregistered_instances);
100    }
101
102    #[test]
103    fn writer_roundtrip() {
104        let p = WriterDataLifecycleQosPolicy {
105            autodispose_unregistered_instances: false,
106        };
107        let mut w = BufferWriter::new(Endianness::Little);
108        p.encode_into(&mut w).unwrap();
109        let bytes = w.into_bytes();
110        assert_eq!(bytes.len(), 4);
111        let mut r = BufferReader::new(&bytes, Endianness::Little);
112        assert_eq!(
113            WriterDataLifecycleQosPolicy::decode_from(&mut r).unwrap(),
114            p
115        );
116    }
117
118    #[test]
119    fn reader_default_is_infinite() {
120        let d = ReaderDataLifecycleQosPolicy::default();
121        assert!(d.autopurge_nowriter_samples_delay.is_infinite());
122        assert!(d.autopurge_disposed_samples_delay.is_infinite());
123    }
124
125    #[test]
126    fn reader_roundtrip() {
127        let p = ReaderDataLifecycleQosPolicy {
128            autopurge_nowriter_samples_delay: Duration::from_secs(5),
129            autopurge_disposed_samples_delay: Duration::from_secs(10),
130        };
131        let mut w = BufferWriter::new(Endianness::Little);
132        p.encode_into(&mut w).unwrap();
133        let bytes = w.into_bytes();
134        assert_eq!(bytes.len(), 16);
135        let mut r = BufferReader::new(&bytes, Endianness::Little);
136        assert_eq!(
137            ReaderDataLifecycleQosPolicy::decode_from(&mut r).unwrap(),
138            p
139        );
140    }
141}