tiny_counter/formatter/
bincode.rs

1use crate::{formatter::Formatter, Result, SingleEventCounter};
2
3/// Bincode serialization format.
4///
5/// Compact binary format, fast serialization/deserialization.
6#[derive(Debug, Clone, Copy)]
7pub struct BincodeFormat;
8
9impl Formatter for BincodeFormat {
10    fn serialize(&self, value: &SingleEventCounter) -> Result<Vec<u8>> {
11        bincode::serialize(value).map_err(|e| crate::Error::Serialization(e.to_string()))
12    }
13
14    fn deserialize(&self, bytes: &[u8]) -> Result<SingleEventCounter> {
15        bincode::deserialize(bytes).map_err(|e| crate::Error::Serialization(e.to_string()))
16    }
17
18    fn extension(&self) -> &'static str {
19        ".bin"
20    }
21}
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26    use crate::{EventCounterConfig, SingleEventCounter};
27    use chrono::Utc;
28
29    #[test]
30    fn test_bincode_roundtrip() {
31        let formatter = BincodeFormat;
32        let now = Utc::now();
33        let config = EventCounterConfig::default();
34        let counter = config.create_counter(now);
35
36        let bytes = formatter.serialize(&counter).unwrap();
37        let decoded: SingleEventCounter = formatter.deserialize(&bytes).unwrap();
38
39        // Verify structure matches
40        assert_eq!(decoded.intervals().len(), counter.intervals().len());
41    }
42
43    #[test]
44    fn test_bincode_extension() {
45        let formatter = BincodeFormat;
46        assert_eq!(formatter.extension(), ".bin");
47    }
48}