nodedb_cluster/
sync_frame_versioned.rs1use nodedb_types::SyncFrame;
16
17use crate::error::{ClusterError, Result};
18use crate::wire_version::{unwrap_bytes_versioned, wrap_bytes_versioned};
19
20pub fn encode_versioned_sync_frame(frame: &SyncFrame) -> Result<Vec<u8>> {
26 let raw = frame.to_bytes();
27 wrap_bytes_versioned(&raw).map_err(|e| ClusterError::Codec {
28 detail: format!("SyncFrame versioned encode: {e}"),
29 })
30}
31
32pub fn decode_versioned_sync_frame(data: &[u8]) -> Result<SyncFrame> {
37 let inner = unwrap_bytes_versioned(data).map_err(|e| ClusterError::Codec {
38 detail: format!("SyncFrame versioned decode: {e}"),
39 })?;
40 SyncFrame::from_bytes(inner).ok_or_else(|| ClusterError::Codec {
41 detail: "SyncFrame::from_bytes failed: malformed or truncated frame".to_string(),
42 })
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48 use nodedb_types::{SyncFrame, SyncMessageType};
49
50 #[derive(
52 serde::Serialize, serde::Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack,
53 )]
54 struct PingMsg {
55 seq: u64,
56 }
57
58 fn make_ping_frame() -> SyncFrame {
59 let msg = PingMsg { seq: 1 };
60 SyncFrame::new_msgpack(SyncMessageType::PingPong, &msg).unwrap()
61 }
62
63 #[test]
64 fn sync_frame_versioned_roundtrip() {
65 let frame = make_ping_frame();
66 let encoded = encode_versioned_sync_frame(&frame).unwrap();
67 let decoded = decode_versioned_sync_frame(&encoded).unwrap();
68 assert_eq!(frame.msg_type, decoded.msg_type);
69 assert_eq!(frame.body, decoded.body);
70 }
71}