1use std::cmp::Ord;
2use std::collections::{BTreeMap, HashMap};
3
4use anyhow::Result;
5use serde::de::DeserializeOwned;
6use serde::{Deserialize, Deserializer, Serialize, Serializer};
7
8use crate::MultiMap;
9
10pub fn to_json<T: Serialize>(obj: &T) -> String {
12 serde_json::to_string_pretty(obj).unwrap()
13}
14
15pub fn to_json_terse<T: Serialize>(obj: &T) -> String {
17 serde_json::to_string(obj).unwrap()
18}
19
20pub fn from_json<T: DeserializeOwned>(raw: &[u8]) -> Result<T> {
22 serde_json::from_slice(raw).map_err(|err| err.into())
23}
24
25pub fn from_json_reader<R: std::io::Read, T: DeserializeOwned>(reader: R) -> Result<T> {
27 serde_json::from_reader(reader).map_err(|err| err.into())
28}
29
30pub fn from_binary<T: DeserializeOwned>(raw: &[u8]) -> Result<T> {
32 bincode::deserialize(raw).map_err(|err| err.into())
33}
34
35pub fn from_binary_reader<R: std::io::Read, T: DeserializeOwned>(reader: R) -> Result<T> {
37 bincode::deserialize_from(reader).map_err(|err| err.into())
38}
39
40pub fn serialized_size_bytes<T: Serialize>(obj: &T) -> usize {
42 bincode::serialized_size(obj).unwrap() as usize
43}
44
45pub fn to_binary<T: Serialize>(obj: &T) -> Vec<u8> {
47 bincode::serialize(obj).unwrap()
48}
49
50pub fn serialize_btreemap<S: Serializer, K: Serialize, V: Serialize>(
53 map: &BTreeMap<K, V>,
54 s: S,
55) -> Result<S::Ok, S::Error> {
56 map.iter().collect::<Vec<(_, _)>>().serialize(s)
57}
58
59pub fn deserialize_btreemap<
62 'de,
63 D: Deserializer<'de>,
64 K: Deserialize<'de> + Ord,
65 V: Deserialize<'de>,
66>(
67 d: D,
68) -> Result<BTreeMap<K, V>, D::Error> {
69 let vec = <Vec<(K, V)>>::deserialize(d)?;
70 let mut map = BTreeMap::new();
71 for (k, v) in vec {
72 map.insert(k, v);
73 }
74 Ok(map)
75}
76
77pub fn serialize_hashmap<S: Serializer, K: Serialize + Ord, V: Serialize>(
80 map: &HashMap<K, V>,
81 s: S,
82) -> Result<S::Ok, S::Error> {
83 let mut list: Vec<(&K, &V)> = map.iter().collect();
84 list.sort_by_key(|(k, _)| *k);
85 list.serialize(s)
86}
87
88pub fn deserialize_hashmap<
90 'de,
91 D: Deserializer<'de>,
92 K: Deserialize<'de> + std::hash::Hash + Eq,
93 V: Deserialize<'de>,
94>(
95 d: D,
96) -> Result<HashMap<K, V>, D::Error> {
97 let vec = <Vec<(K, V)>>::deserialize(d)?;
98 let mut map = HashMap::new();
99 for (k, v) in vec {
100 map.insert(k, v);
101 }
102 Ok(map)
103}
104
105pub fn serialize_multimap<
107 S: Serializer,
108 K: Serialize + Eq + Ord + Clone,
109 V: Serialize + Eq + Ord + Clone,
110>(
111 map: &MultiMap<K, V>,
112 s: S,
113) -> Result<S::Ok, S::Error> {
114 map.borrow().iter().collect::<Vec<(_, _)>>().serialize(s)
115}
116
117pub fn deserialize_multimap<
119 'de,
120 D: Deserializer<'de>,
121 K: Deserialize<'de> + Eq + Ord + Clone,
122 V: Deserialize<'de> + Eq + Ord + Clone,
123>(
124 d: D,
125) -> Result<MultiMap<K, V>, D::Error> {
126 let vec = <Vec<(K, Vec<V>)>>::deserialize(d)?;
127 let mut map = MultiMap::new();
128 for (key, values) in vec {
129 for value in values {
130 map.insert(key.clone(), value);
131 }
132 }
133 Ok(map)
134}
135
136pub fn serialize_usize<S: Serializer>(x: &usize, s: S) -> Result<S::Ok, S::Error> {
139 if let Ok(x) = u32::try_from(*x) {
140 x.serialize(s)
141 } else {
142 Err(serde::ser::Error::custom(format!("{} can't fit in u32", x)))
143 }
144}
145
146pub fn deserialize_usize<'de, D: Deserializer<'de>>(d: D) -> Result<usize, D::Error> {
148 let x = <u32>::deserialize(d)?;
149 Ok(x as usize)
150}