abstutil/
serde.rs

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
10/// Stringifies an object to nicely formatted JSON.
11pub fn to_json<T: Serialize>(obj: &T) -> String {
12    serde_json::to_string_pretty(obj).unwrap()
13}
14
15/// Stringifies an object to terse JSON.
16pub fn to_json_terse<T: Serialize>(obj: &T) -> String {
17    serde_json::to_string(obj).unwrap()
18}
19
20/// Deserializes an object from a JSON string.
21pub fn from_json<T: DeserializeOwned>(raw: &[u8]) -> Result<T> {
22    serde_json::from_slice(raw).map_err(|err| err.into())
23}
24
25/// Deserializes an object from JSON, from a reader.
26pub 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
30/// Deserializes an object from the bincode format.
31pub fn from_binary<T: DeserializeOwned>(raw: &[u8]) -> Result<T> {
32    bincode::deserialize(raw).map_err(|err| err.into())
33}
34
35/// Deserializes an object from the bincode format, from a reader.
36pub 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
40/// The number of bytes for an object serialized to bincode.
41pub fn serialized_size_bytes<T: Serialize>(obj: &T) -> usize {
42    bincode::serialized_size(obj).unwrap() as usize
43}
44
45/// Transforms an object to bincoded bytes.
46pub fn to_binary<T: Serialize>(obj: &T) -> Vec<u8> {
47    bincode::serialize(obj).unwrap()
48}
49
50/// Serializes a BTreeMap as a list of tuples. Necessary when the keys are structs; see
51/// https://github.com/serde-rs/json/issues/402.
52pub 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
59/// Deserializes a BTreeMap from a list of tuples. Necessary when the keys are structs; see
60/// https://github.com/serde-rs/json/issues/402.
61pub 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
77/// Serializes a HashMap as a list of tuples, first sorting by the keys. This ensures the
78/// serialized form is deterministic.
79pub 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
88/// Deserializes a HashMap from a list of tuples.
89pub 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
105/// Serializes a MultiMap.
106pub 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
117/// Deserializes a MultiMap.
118pub 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
136/// Serializes a `usize` as a `u32` to save space. Useful when you need `usize` for indexing, but
137/// the values don't exceed 2^32.
138pub 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
146/// Deserializes a `usize` from a `u32`.
147pub 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}