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}