From 73e7e264cc996c42510d9c8e774dd46cfc160a74 Mon Sep 17 00:00:00 2001 From: syn Date: Fri, 14 Feb 2020 14:21:17 +0300 Subject: deserialize duration from floats --- src/backends/clang.rs | 7 ++++--- src/backends/python.rs | 18 +++++++++++++----- src/conf.rs | 4 ++-- src/main.rs | 1 + src/serde_duration.rs | 28 ++++++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 src/serde_duration.rs diff --git a/src/backends/clang.rs b/src/backends/clang.rs index 11c316a..361c759 100644 --- a/src/backends/clang.rs +++ b/src/backends/clang.rs @@ -1,4 +1,4 @@ -use serde_derive::{ Serialize, Deserialize }; +use serde_derive::Deserialize; use crate::backends::{ Backend, mk_tmp_dir, RunError }; use std::path::{ Path, PathBuf }; use std::io::{ Result as IoResult, Error, ErrorKind }; @@ -7,9 +7,10 @@ use std::collections::hash_map::DefaultHasher; use std::hash::{ Hash, Hasher }; use crate::wait::{ ChildExitStatus, wait_child }; use std::time::Duration; +use crate::serde_duration::deserialize_duration; -#[derive(Debug, Serialize, Deserialize, Default)] +#[derive(Debug, Deserialize, Default)] pub struct ClangBackend { template: Option, @@ -19,7 +20,7 @@ pub struct ClangBackend { #[serde(default = "default_cc")] cc: String, - #[serde(default = "default_timeout")] + #[serde(default = "default_timeout", deserialize_with = "deserialize_duration")] timeout: Duration } diff --git a/src/backends/python.rs b/src/backends/python.rs index 3ee7b35..7e0dac1 100644 --- a/src/backends/python.rs +++ b/src/backends/python.rs @@ -1,14 +1,23 @@ -use serde_derive::{ Serialize, Deserialize }; +use serde_derive::Deserialize; use crate::backends::{ Backend, RunError }; use std::process::{ Command }; use std::path::Path; use crate::wait::{ wait_child, ChildExitStatus }; +use crate::serde_duration::deserialize_duration; +use std::time::Duration; -#[derive(Debug, Serialize, Deserialize, Default)] +#[derive(Debug, Deserialize, Default)] pub struct PythonBackend { template: Option, version: Option, - timeout: Option, + + #[serde(default = "default_timeout", deserialize_with = "deserialize_duration")] + timeout: Duration, +} + + +fn default_timeout() -> Duration { + Duration::from_secs(1) } @@ -39,7 +48,6 @@ impl Backend for PythonBackend { .arg(fname.as_os_str()) .spawn()?; - let timeout = std::time::Duration::from_secs_f32(self.timeout.unwrap_or(1.0)); - Ok(wait_child(child, timeout, timer)?) + Ok(wait_child(child, self.timeout, timer)?) } } \ No newline at end of file diff --git a/src/conf.rs b/src/conf.rs index cc281f0..8aeb8e3 100644 --- a/src/conf.rs +++ b/src/conf.rs @@ -1,4 +1,4 @@ -use serde_derive::{ Serialize, Deserialize }; +use serde_derive::Deserialize; use std::path::{ PathBuf, Path }; use toml::de; use log::{ error }; @@ -9,7 +9,7 @@ use std::io::ErrorKind; use crate::backends::{ Backend, PythonBackend, ClangBackend }; -#[derive(Debug, Serialize, Deserialize, Default)] +#[derive(Debug, Deserialize, Default)] pub struct Conf { #[serde(skip)] path: Option, diff --git a/src/main.rs b/src/main.rs index 4eeb298..1bb683b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ use std::io::prelude::*; mod conf; mod backends; mod wait; +mod serde_duration; fn main() { let matches = App::new("evr") 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 +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 (self, v: f32) -> Result { + Ok(Duration::from_secs_f32(v)) + } + + fn visit_f64 (self, v: f64) -> Result { + Ok(Duration::from_secs_f64(v)) + } + } + + deserializer.deserialize_any(DurationVisitor) +} -- cgit v1.2.1-18-gbd029