From d1b222fa7fbe8ae66d25afa6bffb3e4127d9efbe Mon Sep 17 00:00:00 2001 From: elkowar <5300871+elkowar@users.noreply.github.com> Date: Fri, 29 Apr 2022 14:20:12 +0200 Subject: [PATCH] Allow for floating point numbers in durations (fixes #447) --- crates/simplexpr/src/dynval.rs | 49 ++++++++++++------- ...lexpr__dynval__test__parse_duration-2.snap | 8 +++ ...lexpr__dynval__test__parse_duration-3.snap | 8 +++ ...lexpr__dynval__test__parse_duration-4.snap | 8 +++ ...lexpr__dynval__test__parse_duration-5.snap | 8 +++ ...lexpr__dynval__test__parse_duration-6.snap | 8 +++ ...lexpr__dynval__test__parse_duration-7.snap | 8 +++ ...lexpr__dynval__test__parse_duration-8.snap | 8 +++ ...mplexpr__dynval__test__parse_duration.snap | 8 +++ .../snapshots/yuck__config__test__config.snap | 8 +-- 10 files changed, 99 insertions(+), 22 deletions(-) create mode 100644 crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-2.snap create mode 100644 crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-3.snap create mode 100644 crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-4.snap create mode 100644 crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-5.snap create mode 100644 crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-6.snap create mode 100644 crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-7.snap create mode 100644 crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-8.snap create mode 100644 crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration.snap diff --git a/crates/simplexpr/src/dynval.rs b/crates/simplexpr/src/dynval.rs index a22b914..e730d0a 100644 --- a/crates/simplexpr/src/dynval.rs +++ b/crates/simplexpr/src/dynval.rs @@ -169,17 +169,18 @@ impl DynVal { s.trim_end_matches("ms").parse().map_err(|e| ConversionError::new(self.clone(), "integer", e))?, )) } else if s.ends_with('s') { - Ok(Duration::from_secs( - s.trim_end_matches('s').parse().map_err(|e| ConversionError::new(self.clone(), "integer", e))?, - )) - } else if s.ends_with('m') { - Ok(Duration::from_secs( - s.trim_end_matches('m').parse::().map_err(|e| ConversionError::new(self.clone(), "integer", e))? * 60, - )) + let secs = s.trim_end_matches('s').parse::().map_err(|e| ConversionError::new(self.clone(), "number", e))?; + Ok(Duration::from_millis(f64::floor(secs * 1000f64) as u64)) + } else if s.ends_with('m') || s.ends_with("min") { + let minutes = s + .trim_end_matches("min") + .trim_end_matches('m') + .parse::() + .map_err(|e| ConversionError::new(self.clone(), "number", e))?; + Ok(Duration::from_secs(f64::floor(minutes * 60f64) as u64)) } else if s.ends_with('h') { - Ok(Duration::from_secs( - s.trim_end_matches('h').parse::().map_err(|e| ConversionError::new(self.clone(), "integer", e))? * 60 * 60, - )) + let hours = s.trim_end_matches('h').parse::().map_err(|e| ConversionError::new(self.clone(), "number", e))?; + Ok(Duration::from_secs(f64::floor(hours * 60f64 * 60f64) as u64)) } else { Err(ConversionError { value: self.clone(), target_type: "duration", source: None }) } @@ -238,13 +239,25 @@ mod test { use super::*; #[test] fn test_parse_vec() { - insta::assert_debug_snapshot!(DynVal::from_string("[]".to_string()).as_vec()); - insta::assert_debug_snapshot!(DynVal::from_string("[hi]".to_string()).as_vec()); - insta::assert_debug_snapshot!(DynVal::from_string("[hi,ho,hu]".to_string()).as_vec()); - insta::assert_debug_snapshot!(DynVal::from_string("[hi\\,ho]".to_string()).as_vec()); - insta::assert_debug_snapshot!(DynVal::from_string("[hi\\,ho,hu]".to_string()).as_vec()); - insta::assert_debug_snapshot!(DynVal::from_string("".to_string()).as_vec()); - insta::assert_debug_snapshot!(DynVal::from_string("[a,b".to_string()).as_vec()); - insta::assert_debug_snapshot!(DynVal::from_string("a]".to_string()).as_vec()); + insta::assert_debug_snapshot!(DynVal::from("[]").as_vec()); + insta::assert_debug_snapshot!(DynVal::from("[hi]").as_vec()); + insta::assert_debug_snapshot!(DynVal::from("[hi,ho,hu]").as_vec()); + insta::assert_debug_snapshot!(DynVal::from("[hi\\,ho]").as_vec()); + insta::assert_debug_snapshot!(DynVal::from("[hi\\,ho,hu]").as_vec()); + insta::assert_debug_snapshot!(DynVal::from("").as_vec()); + insta::assert_debug_snapshot!(DynVal::from("[a,b").as_vec()); + insta::assert_debug_snapshot!(DynVal::from("a]").as_vec()); + } + + #[test] + fn test_parse_duration() { + insta::assert_debug_snapshot!(DynVal::from("100ms").as_duration()); + insta::assert_debug_snapshot!(DynVal::from("1s").as_duration()); + insta::assert_debug_snapshot!(DynVal::from("0.1s").as_duration()); + insta::assert_debug_snapshot!(DynVal::from("5m").as_duration()); + insta::assert_debug_snapshot!(DynVal::from("5min").as_duration()); + insta::assert_debug_snapshot!(DynVal::from("0.5m").as_duration()); + insta::assert_debug_snapshot!(DynVal::from("1h").as_duration()); + insta::assert_debug_snapshot!(DynVal::from("0.5h").as_duration()); } } diff --git a/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-2.snap b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-2.snap new file mode 100644 index 0000000..c583166 --- /dev/null +++ b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-2.snap @@ -0,0 +1,8 @@ +--- +source: crates/simplexpr/src/dynval.rs +expression: "DynVal::from(\"1s\").as_duration()" + +--- +Ok( + 1s, +) diff --git a/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-3.snap b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-3.snap new file mode 100644 index 0000000..ac0c478 --- /dev/null +++ b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-3.snap @@ -0,0 +1,8 @@ +--- +source: crates/simplexpr/src/dynval.rs +expression: "DynVal::from(\"0.1s\").as_duration()" + +--- +Ok( + 100ms, +) diff --git a/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-4.snap b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-4.snap new file mode 100644 index 0000000..449bf69 --- /dev/null +++ b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-4.snap @@ -0,0 +1,8 @@ +--- +source: crates/simplexpr/src/dynval.rs +expression: "DynVal::from(\"5m\").as_duration()" + +--- +Ok( + 300s, +) diff --git a/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-5.snap b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-5.snap new file mode 100644 index 0000000..1e56e71 --- /dev/null +++ b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-5.snap @@ -0,0 +1,8 @@ +--- +source: crates/simplexpr/src/dynval.rs +expression: "DynVal::from(\"5min\").as_duration()" + +--- +Ok( + 300s, +) diff --git a/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-6.snap b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-6.snap new file mode 100644 index 0000000..092f3d8 --- /dev/null +++ b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-6.snap @@ -0,0 +1,8 @@ +--- +source: crates/simplexpr/src/dynval.rs +expression: "DynVal::from(\"0.5m\").as_duration()" + +--- +Ok( + 30s, +) diff --git a/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-7.snap b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-7.snap new file mode 100644 index 0000000..fef5215 --- /dev/null +++ b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-7.snap @@ -0,0 +1,8 @@ +--- +source: crates/simplexpr/src/dynval.rs +expression: "DynVal::from(\"1h\").as_duration()" + +--- +Ok( + 3600s, +) diff --git a/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-8.snap b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-8.snap new file mode 100644 index 0000000..225655f --- /dev/null +++ b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration-8.snap @@ -0,0 +1,8 @@ +--- +source: crates/simplexpr/src/dynval.rs +expression: "DynVal::from(\"0.5h\").as_duration()" + +--- +Ok( + 1800s, +) diff --git a/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration.snap b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration.snap new file mode 100644 index 0000000..34309ae --- /dev/null +++ b/crates/simplexpr/src/snapshots/simplexpr__dynval__test__parse_duration.snap @@ -0,0 +1,8 @@ +--- +source: crates/simplexpr/src/dynval.rs +expression: "DynVal::from(\"100ms\").as_duration()" + +--- +Ok( + 100ms, +) diff --git a/crates/yuck/src/config/snapshots/yuck__config__test__config.snap b/crates/yuck/src/config/snapshots/yuck__config__test__config.snap index 5aa9681..2440bf0 100644 --- a/crates/yuck/src/config/snapshots/yuck__config__test__config.snap +++ b/crates/yuck/src/config/snapshots/yuck__config__test__config.snap @@ -19,7 +19,7 @@ Config( span: Span(29, 33, 0), ), ], - widget: WidgetUse( + widget: Basic(BasicWidgetUse( name: "foo", attrs: Attributes( span: Span(51, 61, 0), @@ -33,7 +33,7 @@ Config( children: [], span: Span(47, 62, 0), name_span: Span(48, 51, 0), - ), + )), span: Span(9, 63, 0), args_span: Span(24, 34, 0), ), @@ -57,7 +57,7 @@ Config( )), stacking: Foreground, monitor_number: Some(12), - widget: WidgetUse( + widget: Basic(BasicWidgetUse( name: "bar", attrs: Attributes( span: Span(467, 478, 0), @@ -71,7 +71,7 @@ Config( children: [], span: Span(463, 479, 0), name_span: Span(464, 467, 0), - ), + )), resizable: true, backend_options: BackendWindowOptions( wm_ignore: false,