diff options
author | syn <isaqtm@gmail.com> | 2020-02-14 14:21:17 +0300 |
---|---|---|
committer | syn <isaqtm@gmail.com> | 2020-02-14 14:21:17 +0300 |
commit | 73e7e264cc996c42510d9c8e774dd46cfc160a74 (patch) | |
tree | 9416ff130da63809d0205b599a3e3ba3cf40e569 /src/serde_duration.rs | |
parent | 3da19e8603c00c02ec7e24ea8910a7c386b09018 (diff) | |
download | evr-73e7e264cc996c42510d9c8e774dd46cfc160a74.tar.gz |
deserialize duration from floats
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) +} |