zerodds_qos/policies/
data_lifecycle.rs1use zerodds_cdr::{BufferReader, BufferWriter, DecodeError, EncodeError};
10
11use crate::duration::Duration;
12use crate::wire_helpers::{read_bool_padded, write_bool_padded};
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub struct WriterDataLifecycleQosPolicy {
17 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 pub fn encode_into(self, w: &mut BufferWriter) -> Result<(), EncodeError> {
35 write_bool_padded(w, self.autodispose_unregistered_instances)
36 }
37
38 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#[derive(Debug, Clone, Copy, PartialEq, Eq)]
51pub struct ReaderDataLifecycleQosPolicy {
52 pub autopurge_nowriter_samples_delay: Duration,
54 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 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 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}