serde_utils/
list_of_bytes_lists.rs1use 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}