serde_utils/
list_of_bytes_lists.rs

1//! Formats `Vec<u64>` using quotes.
2//!
3//! E.g., `vec![0, 1, 2]` serializes as `["0", "1", "2"]`.
4//!
5//! Quotes can be optional during decoding.
6
7use crate::hex;
8use serde::ser::SerializeSeq;
9use serde::{de, Deserializer, Serializer};
10
11pub struct ListOfBytesListVisitor;
12impl<'a> serde::de::Visitor<'a> for ListOfBytesListVisitor {
13    type Value = Vec<Vec<u8>>;
14
15    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
16        write!(formatter, "a list of 0x-prefixed byte lists")
17    }
18
19    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
20    where
21        A: serde::de::SeqAccess<'a>,
22    {
23        let mut vec = vec![];
24
25        while let Some(val) = seq.next_element::<String>()? {
26            vec.push(hex::decode(&val).map_err(de::Error::custom)?);
27        }
28
29        Ok(vec)
30    }
31}
32
33pub fn serialize<S>(value: &[Vec<u8>], serializer: S) -> Result<S::Ok, S::Error>
34where
35    S: Serializer,
36{
37    let mut seq = serializer.serialize_seq(Some(value.len()))?;
38    for val in value {
39        seq.serialize_element(&hex::encode(val))?;
40    }
41    seq.end()
42}
43
44pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<Vec<u8>>, D::Error>
45where
46    D: Deserializer<'de>,
47{
48    deserializer.deserialize_any(ListOfBytesListVisitor)
49}
50
51#[cfg(test)]
52mod test {
53    use serde::{Deserialize, Serialize};
54
55    #[derive(Debug, PartialEq, Serialize, Deserialize)]
56    #[serde(transparent)]
57    struct Wrapper {
58        #[serde(with = "super")]
59        val: Vec<Vec<u8>>,
60    }
61
62    #[test]
63    fn encoding() {
64        assert_eq!(
65            &serde_json::to_string(&Wrapper { val: vec![vec![0]] }).unwrap(),
66            "[\"0x00\"]"
67        );
68        assert_eq!(
69            &serde_json::to_string(&Wrapper {
70                val: vec![vec![0, 1, 2]]
71            })
72            .unwrap(),
73            "[\"0x000102\"]"
74        );
75        assert_eq!(
76            &serde_json::to_string(&Wrapper {
77                val: vec![vec![0], vec![0, 1, 2]]
78            })
79            .unwrap(),
80            "[\"0x00\",\"0x000102\"]"
81        );
82    }
83
84    #[test]
85    fn decoding() {
86        assert_eq!(
87            serde_json::from_str::<Wrapper>("[\"0x00\"]").unwrap(),
88            Wrapper { val: vec![vec![0]] },
89        );
90        assert_eq!(
91            serde_json::from_str::<Wrapper>("[\"0x000102\"]").unwrap(),
92            Wrapper {
93                val: vec![vec![0, 1, 2]]
94            },
95        );
96        assert_eq!(
97            serde_json::from_str::<Wrapper>("[\"0x00\",\"0x000102\"]").unwrap(),
98            Wrapper {
99                val: vec![vec![0], vec![0, 1, 2]]
100            },
101        );
102    }
103}