Skip to main content

msg_bebop/
lib.rs

1//! # Msg Bebop Library
2//!
3//! High-performance message serialization using Bebop for Rust.
4//!
5//! ## Example
6//!
7//! ```rust
8//! use msg_bebop::Msg;
9//! use bebop::Record;
10//!
11//! let msg = Msg {
12//!     body: "Hello, world!",
13//!     from_id: "sender123",
14//!     id: "msg456",
15//!     to_ids: vec!["recipient1", "recipient2"],
16//!     _type: "greeting",
17//! };
18//!
19//! // Serialize
20//! let mut bytes = Vec::new();
21//! msg.serialize(&mut bytes)?;
22//!
23//! // Deserialize
24//! let decoded_msg = Msg::deserialize(&bytes)?;
25//! # Ok::<(), Box<dyn std::error::Error>>(())
26//! ```
27
28// Re-export the generated Bebop structures
29pub use crate::msg::*;
30
31// Include the generated Bebop code
32mod msg;
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37    use bebop::Record;  // Import the trait to use serialize/deserialize methods
38
39    #[test]
40    fn test_msg_serialization() {
41        let original = Msg {
42            body: "Test message",
43            from_id: "user1",
44            id: "test123",
45            to_ids: vec!["user2", "user3"],
46            _type: "test",
47        };
48
49        // Serialize
50        let mut serialized = Vec::new();
51        original.serialize(&mut serialized).unwrap();
52        assert!(!serialized.is_empty());
53
54        // Deserialize
55        let deserialized = Msg::deserialize(&serialized).expect("Deserialization failed");
56
57        // Verify
58        assert_eq!(original, deserialized);
59    }
60
61    #[test]
62    fn test_empty_to_ids() {
63        let msg = Msg {
64            body: "Broadcast message",
65            from_id: "system",
66            id: "broadcast1",
67            to_ids: vec![],
68            _type: "broadcast",
69        };
70
71        let mut bytes = Vec::new();
72        msg.serialize(&mut bytes).unwrap();
73        let decoded = Msg::deserialize(&bytes).unwrap();
74        assert_eq!(msg.to_ids.len(), 0);
75        assert_eq!(decoded.to_ids.len(), 0);
76    }
77
78    #[test]
79    fn test_performance_benchmark() {
80        // Create some user IDs first since we need &str
81        let user_ids: Vec<String> = (0..10).map(|i| format!("user{}", i)).collect();
82        let user_refs: Vec<&str> = user_ids.iter().map(|s| s.as_str()).collect();
83        let body = "x".repeat(1000);
84
85        let msg = Msg {
86            body: &body, // 1KB message
87            from_id: "perf_test",
88            id: "perf123",
89            to_ids: user_refs,
90            _type: "performance",
91        };
92
93        let start = std::time::Instant::now();
94
95        // Serialize/deserialize 1000 times
96        for _ in 0..1000 {
97            let mut bytes = Vec::new();
98            msg.serialize(&mut bytes).unwrap();
99            let _decoded = Msg::deserialize(&bytes).unwrap();
100        }
101
102        let duration = start.elapsed();
103        println!("1000 serialize/deserialize cycles took: {:?}", duration);
104
105        // Should be very fast (adjust threshold as needed)
106        assert!(duration.as_millis() < 100, "Performance test failed: took {:?}", duration);
107    }
108}