diff options
Diffstat (limited to 'src/serde_duration.rs')
-rw-r--r-- | src/serde_duration.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/serde_duration.rs b/src/serde_duration.rs new file mode 100644 index 0000000..50076b0 --- /dev/null +++ b/src/serde_duration.rs @@ -0,0 +1,28 @@ +use serde::de::{ Visitor, Error, Deserializer }; +use std::time::Duration; +use std::fmt; + +pub fn deserialize_duration<'de, D>(deserializer: D) -> Result<Duration, D::Error> +where + D: Deserializer<'de> +{ + struct DurationVisitor; + + impl<'de> Visitor<'de> for DurationVisitor { + type Value = Duration; + + fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "duration in secs") + } + + fn visit_f32<E: Error> (self, v: f32) -> Result<Self::Value, E> { + Ok(Duration::from_secs_f32(v)) + } + + fn visit_f64<E: Error> (self, v: f64) -> Result<Self::Value, E> { + Ok(Duration::from_secs_f64(v)) + } + } + + deserializer.deserialize_any(DurationVisitor) +} |