cosmic_files/sequencing/
serde_helpers.rs

1pub mod u8_btree_map {
2    use serde::{Deserialize, Deserializer, Serialize, Serializer};
3    use std::collections::BTreeMap;
4
5    pub fn serialize<S, V: Serialize>(map: &BTreeMap<u8, V>, s: S) -> Result<S::Ok, S::Error>
6    where
7        S: Serializer,
8    {
9        let pairs: Vec<(u8, &V)> = map.iter().map(|(k, v)| (*k, v)).collect();
10        pairs.serialize(s)
11    }
12
13    pub fn deserialize<'de, D, V: Deserialize<'de>>(d: D) -> Result<BTreeMap<u8, V>, D::Error>
14    where
15        D: Deserializer<'de>,
16    {
17        let pairs: Vec<(u8, V)> = Vec::deserialize(d)?;
18        Ok(pairs.into_iter().collect())
19    }
20}
21
22pub mod option_systemtime_secs {
23    use serde::{Deserialize, Deserializer, Serializer};
24    use std::time::{Duration, SystemTime, UNIX_EPOCH};
25
26    pub fn serialize<S: Serializer>(t: &Option<SystemTime>, s: S) -> Result<S::Ok, S::Error> {
27        match t {
28            None => s.serialize_none(),
29            Some(st) => {
30                let secs = st.duration_since(UNIX_EPOCH).unwrap_or_default().as_secs();
31                s.serialize_some(&secs)
32            }
33        }
34    }
35
36    pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Option<SystemTime>, D::Error> {
37        let opt: Option<u64> = Option::deserialize(d)?;
38        Ok(opt.map(|secs| UNIX_EPOCH + Duration::from_secs(secs)))
39    }
40}