summaryrefslogtreecommitdiffstats
path: root/src/serde_duration.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/serde_duration.rs')
-rw-r--r--src/serde_duration.rs28
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)
+}