agentic_robotics_core/
serialization.rs

1//! Zero-copy serialization strategies
2//!
3//! Supports both CDR (DDS-compatible) and rkyv (zero-copy) serialization
4
5use crate::error::{Error, Result};
6use crate::message::Message;
7use serde::{Deserialize, Serialize};
8
9/// Serialization format
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum Format {
12    /// CDR (Common Data Representation) - DDS compatible
13    Cdr,
14    /// rkyv zero-copy archives
15    Rkyv,
16    /// JSON (for debugging)
17    Json,
18}
19
20/// Serialize a message using CDR format
21pub fn serialize_cdr<T: Serialize>(msg: &T) -> Result<Vec<u8>> {
22    cdr::serialize::<_, _, cdr::CdrBe>(msg, cdr::Infinite)
23        .map_err(|e| Error::Serialization(e.to_string()))
24}
25
26/// Deserialize a message using CDR format
27pub fn deserialize_cdr<T: for<'de> Deserialize<'de>>(data: &[u8]) -> Result<T> {
28    cdr::deserialize::<T>(data)
29        .map_err(|e| Error::Serialization(e.to_string()))
30}
31
32/// Serialize a message using rkyv (zero-copy)
33pub fn serialize_rkyv<T>(_msg: &T) -> Result<Vec<u8>>
34where
35    T: Serialize,
36{
37    // Simplified implementation for compatibility
38    // In production, use proper rkyv serialization
39    Err(Error::Serialization("rkyv serialization not fully implemented".to_string()))
40}
41
42/// Serialize a message to JSON
43pub fn serialize_json<T: Serialize>(msg: &T) -> Result<String> {
44    serde_json::to_string(msg)
45        .map_err(|e| Error::Serialization(e.to_string()))
46}
47
48/// Deserialize a message from JSON
49pub fn deserialize_json<T: for<'de> Deserialize<'de>>(data: &str) -> Result<T> {
50    serde_json::from_str(data)
51        .map_err(|e| Error::Serialization(e.to_string()))
52}
53
54/// Serializer wrapper
55pub struct Serializer {
56    format: Format,
57}
58
59impl Serializer {
60    pub fn new(format: Format) -> Self {
61        Self { format }
62    }
63
64    pub fn serialize<T: Message>(&self, msg: &T) -> Result<Vec<u8>> {
65        match self.format {
66            Format::Cdr => serialize_cdr(msg),
67            Format::Rkyv => serialize_rkyv(msg),
68            Format::Json => serialize_json(msg).map(|s| s.into_bytes()),
69        }
70    }
71}
72
73impl Default for Serializer {
74    fn default() -> Self {
75        Self::new(Format::Cdr)
76    }
77}
78
79#[cfg(test)]
80mod tests {
81    use super::*;
82    use crate::message::RobotState;
83
84    #[test]
85    fn test_cdr_serialization() {
86        let state = RobotState::default();
87        let bytes = serialize_cdr(&state).unwrap();
88        let decoded: RobotState = deserialize_cdr(&bytes).unwrap();
89        assert_eq!(decoded.position, state.position);
90    }
91
92    #[test]
93    fn test_json_serialization() {
94        let state = RobotState::default();
95        let json = serialize_json(&state).unwrap();
96        let decoded: RobotState = deserialize_json(&json).unwrap();
97        assert_eq!(decoded.position, state.position);
98    }
99
100    #[test]
101    fn test_serializer() {
102        let serializer = Serializer::new(Format::Cdr);
103        let state = RobotState::default();
104        let bytes = serializer.serialize(&state).unwrap();
105        assert!(!bytes.is_empty());
106    }
107}