1
//! Module to adaopt `humantime_serde` to `Option<Duration>`
2

            
3
use humantime_serde_crate::Serde as HtSerde;
4
use serde::{Deserialize, Deserializer, Serialize, Serializer};
5

            
6
/// Serializes an `Option<Duration>` or `Option<SystemTime>` via the humantime crate.
7
pub fn serialize<T, S>(d: &Option<T>, s: S) -> Result<S::Ok, S::Error>
8
where
9
    for<'a> HtSerde<&'a T>: Serialize,
10
    S: Serializer,
11
{
12
    let nested: Option<HtSerde<&T>> = d.as_ref().map(Into::into);
13
    nested.serialize(s)
14
}
15

            
16
/// Deserialize an `Option<Duration>` or `Option<SystemTime>` via the humantime crate.
17
7
pub fn deserialize<'a, T, D>(d: D) -> Result<Option<T>, D::Error>
18
7
where
19
7
    HtSerde<T>: Deserialize<'a>,
20
7
    D: Deserializer<'a>,
21
7
{
22
7
    let got: Option<HtSerde<T>> = Deserialize::deserialize(d)?;
23
7
    Ok(got.map(HtSerde::into_inner))
24
7
}