Skip to main content

edgefirst_schemas/
service.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright © 2025 Au-Zone Technologies. All Rights Reserved.
3
4/// The struct is used by ROS service.
5/// If you want to sent ROS service with Zenoh directly. You should include the header.
6
7#[derive(PartialEq, Clone, Copy, Debug)]
8pub struct ServiceHeader {
9    pub guid: i64,
10    pub seq: u64,
11}
12
13use crate::cdr::{CdrCursor, CdrError, CdrFixed, CdrSizer, CdrWriter};
14
15impl CdrFixed for ServiceHeader {
16    const CDR_SIZE: usize = 16; // i64 + u64
17    fn read_cdr(cursor: &mut CdrCursor<'_>) -> Result<Self, CdrError> {
18        Ok(ServiceHeader {
19            guid: cursor.read_i64()?,
20            seq: cursor.read_u64()?,
21        })
22    }
23    fn write_cdr(&self, writer: &mut CdrWriter<'_>) {
24        writer.write_i64(self.guid);
25        writer.write_u64(self.seq);
26    }
27    fn size_cdr(sizer: &mut CdrSizer) {
28        sizer.size_i64();
29        sizer.size_u64();
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36    use crate::cdr::{decode_fixed, encode_fixed};
37
38    #[test]
39    fn service_header_roundtrip() {
40        let cases = [
41            (0, 0, "zero"),
42            (12345678901234567i64, 1, "typical"),
43            (i64::MAX, u64::MAX, "max values"),
44            (i64::MIN, 0, "min guid"),
45            (-1, 999999, "negative guid"),
46        ];
47        for (guid, seq, name) in cases {
48            let header = ServiceHeader { guid, seq };
49            let bytes = encode_fixed(&header).unwrap();
50            let decoded: ServiceHeader = decode_fixed(&bytes).unwrap();
51            assert_eq!(header, decoded, "failed for case: {}", name);
52        }
53    }
54}