nros_core/
message_info.rs1use crate::Time;
15
16pub const PUBLISHER_GID_SIZE: usize = 16;
18
19#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
24pub struct MessageInfo {
25 source_timestamp: Time,
27 received_timestamp: Time,
29 publication_sequence_number: i64,
31 reception_sequence_number: i64,
33 publisher_gid: [u8; PUBLISHER_GID_SIZE],
35}
36
37impl MessageInfo {
38 pub const fn new() -> Self {
40 Self {
41 source_timestamp: Time::new(0, 0),
42 received_timestamp: Time::new(0, 0),
43 publication_sequence_number: 0,
44 reception_sequence_number: 0,
45 publisher_gid: [0u8; PUBLISHER_GID_SIZE],
46 }
47 }
48
49 pub const fn with_timestamps(source: Time, received: Time) -> Self {
51 Self {
52 source_timestamp: source,
53 received_timestamp: received,
54 publication_sequence_number: 0,
55 reception_sequence_number: 0,
56 publisher_gid: [0u8; PUBLISHER_GID_SIZE],
57 }
58 }
59
60 pub const fn source_timestamp(&self) -> Time {
62 self.source_timestamp
63 }
64
65 pub const fn received_timestamp(&self) -> Time {
67 self.received_timestamp
68 }
69
70 pub const fn publication_sequence_number(&self) -> i64 {
72 self.publication_sequence_number
73 }
74
75 pub const fn reception_sequence_number(&self) -> i64 {
77 self.reception_sequence_number
78 }
79
80 pub const fn publisher_gid(&self) -> &[u8; PUBLISHER_GID_SIZE] {
82 &self.publisher_gid
83 }
84
85 pub fn set_source_timestamp(&mut self, ts: Time) {
87 self.source_timestamp = ts;
88 }
89
90 pub fn set_received_timestamp(&mut self, ts: Time) {
92 self.received_timestamp = ts;
93 }
94
95 pub fn set_publication_sequence_number(&mut self, seq: i64) {
97 self.publication_sequence_number = seq;
98 }
99
100 pub fn set_reception_sequence_number(&mut self, seq: i64) {
102 self.reception_sequence_number = seq;
103 }
104
105 pub fn set_publisher_gid(&mut self, gid: [u8; PUBLISHER_GID_SIZE]) {
107 self.publisher_gid = gid;
108 }
109}
110
111#[derive(Debug, Clone, Copy)]
127pub struct RawMessageInfo<'a> {
128 info: MessageInfo,
129 attachment: &'a [u8],
130}
131
132impl<'a> RawMessageInfo<'a> {
133 pub const fn new(attachment: &'a [u8]) -> Self {
135 Self {
136 info: MessageInfo::new(),
137 attachment,
138 }
139 }
140
141 pub const fn with_info(info: MessageInfo, attachment: &'a [u8]) -> Self {
143 Self { info, attachment }
144 }
145
146 pub const fn attachment(&self) -> &'a [u8] {
148 self.attachment
149 }
150
151 pub const fn info(&self) -> &MessageInfo {
153 &self.info
154 }
155
156 pub const fn source_timestamp(&self) -> Time {
158 self.info.source_timestamp()
159 }
160
161 pub const fn received_timestamp(&self) -> Time {
163 self.info.received_timestamp()
164 }
165
166 pub const fn publisher_gid(&self) -> &[u8; PUBLISHER_GID_SIZE] {
168 self.info.publisher_gid()
169 }
170}
171
172#[cfg(test)]
173mod tests {
174 use super::*;
175
176 #[test]
177 fn test_message_info_default() {
178 let info = MessageInfo::new();
179 assert_eq!(info.source_timestamp(), Time::new(0, 0));
180 assert_eq!(info.publication_sequence_number(), 0);
181 assert_eq!(info.publisher_gid(), &[0u8; PUBLISHER_GID_SIZE]);
182 }
183
184 #[test]
185 fn test_message_info_with_timestamps() {
186 let source = Time::new(1, 500_000_000);
187 let received = Time::new(1, 600_000_000);
188 let info = MessageInfo::with_timestamps(source, received);
189 assert_eq!(info.source_timestamp(), source);
190 assert_eq!(info.received_timestamp(), received);
191 }
192}