agentic_robotics_core/
serialization.rs1use crate::error::{Error, Result};
6use crate::message::Message;
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum Format {
12 Cdr,
14 Rkyv,
16 Json,
18}
19
20pub 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
26pub 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
32pub fn serialize_rkyv<T>(_msg: &T) -> Result<Vec<u8>>
34where
35 T: Serialize,
36{
37 Err(Error::Serialization("rkyv serialization not fully implemented".to_string()))
40}
41
42pub 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
48pub 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
54pub 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}