Coverage Report

Created: 2025-11-28 06:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/roaring-0.11.2/src/treemap/serde.rs
Line
Count
Source
1
use serde::de::SeqAccess;
2
use serde::de::Visitor;
3
use serde::Deserialize;
4
use serde::Deserializer;
5
use serde::Serialize;
6
7
use crate::RoaringTreemap;
8
9
impl<'de> Deserialize<'de> for RoaringTreemap {
10
0
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
11
0
    where
12
0
        D: Deserializer<'de>,
13
    {
14
        struct TreemapVisitor;
15
16
        impl<'de> Visitor<'de> for TreemapVisitor {
17
            type Value = RoaringTreemap;
18
19
0
            fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
20
0
                formatter.write_str("roaring bitmap")
21
0
            }
22
23
0
            fn visit_bytes<E>(self, bytes: &[u8]) -> Result<RoaringTreemap, E>
24
0
            where
25
0
                E: serde::de::Error,
26
            {
27
0
                RoaringTreemap::deserialize_from(bytes).map_err(serde::de::Error::custom)
28
0
            }
29
30
            // in some case bytes will be serialized as a sequence thus we need to accept both
31
            // even if it means non optimal performance
32
0
            fn visit_seq<A>(self, mut seq: A) -> Result<RoaringTreemap, A::Error>
33
0
            where
34
0
                A: SeqAccess<'de>,
35
            {
36
0
                let mut bytes: Vec<u8> = Vec::new();
37
0
                while let Some(el) = seq.next_element()? {
38
0
                    bytes.push(el);
39
0
                }
40
0
                RoaringTreemap::deserialize_from(&*bytes).map_err(serde::de::Error::custom)
41
0
            }
42
        }
43
44
0
        deserializer.deserialize_bytes(TreemapVisitor)
45
0
    }
46
}
47
48
impl Serialize for RoaringTreemap {
49
0
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
50
0
    where
51
0
        S: serde::Serializer,
52
    {
53
0
        let mut buf = Vec::new();
54
0
        self.serialize_into(&mut buf).map_err(serde::ser::Error::custom)?;
55
56
0
        serializer.serialize_bytes(&buf)
57
0
    }
58
}
59
60
#[cfg(test)]
61
mod test {
62
    use crate::RoaringTreemap;
63
    use proptest::prelude::*;
64
65
    proptest! {
66
        #[test]
67
        fn test_serde_json(
68
            treemap in RoaringTreemap::arbitrary(),
69
        ) {
70
            let json = serde_json::to_vec(&treemap).unwrap();
71
            prop_assert_eq!(treemap, serde_json::from_slice(&json).unwrap());
72
        }
73
74
        #[test]
75
        fn test_postcard(
76
            treemap in RoaringTreemap::arbitrary(),
77
        ) {
78
            let buffer = postcard::to_allocvec(&treemap).unwrap();
79
            prop_assert_eq!(treemap, postcard::from_bytes(&buffer).unwrap());
80
        }
81
    }
82
}