vectorize/
lib.rs

1pub mod bypass;
2
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4use std::iter::FromIterator;
5
6pub fn serialize<'a, T, K, V, S>(target: T, ser: S) -> Result<S::Ok, S::Error>
7where
8    S: Serializer,
9    T: IntoIterator<Item = (&'a K, &'a V)>,
10    K: Serialize + 'a,
11    V: Serialize + 'a,
12{
13    let container: Vec<_> = target.into_iter().collect();
14    serde::Serialize::serialize(&container, ser)
15}
16
17pub fn deserialize<'de, T, K, V, D>(des: D) -> Result<T, D::Error>
18where
19    D: Deserializer<'de>,
20    T: FromIterator<(K, V)>,
21    K: Deserialize<'de>,
22    V: Deserialize<'de>,
23{
24    let container: Vec<_> = serde::Deserialize::deserialize(des)?;
25    Ok(container.into_iter().collect())
26}
27
28#[cfg(test)]
29mod tests {
30    use crate as vectorize;
31    use serde::{Deserialize, Serialize};
32    use std::collections::HashMap;
33
34    #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
35    struct MyKey {
36        one: String,
37        two: u16,
38        more: Vec<u8>,
39    }
40
41    #[derive(Debug, Serialize, Deserialize)]
42    struct MyComplexType {
43        #[serde(with = "vectorize")]
44        map: HashMap<MyKey, String>,
45    }
46
47    #[test]
48    fn it_works() -> Result<(), Box<dyn std::error::Error>> {
49        let key = MyKey {
50            one: "1".into(),
51            two: 2,
52            more: vec![1, 2, 3],
53        };
54        let mut map = HashMap::new();
55        map.insert(key.clone(), "value".into());
56        let instance = MyComplexType { map };
57        let serialized = serde_json::to_string(&instance)?;
58        println!("JSON: {}", serialized);
59        let deserialized: MyComplexType = serde_json::from_str(&serialized)?;
60        let expected_value = "value".to_string();
61        assert_eq!(deserialized.map.get(&key), Some(&expected_value));
62        Ok(())
63    }
64}