From 1cbee4a0114ed134d5c14ba374635ee96073463b Mon Sep 17 00:00:00 2001 From: nicolas Date: Mon, 19 Dec 2022 00:28:38 +0100 Subject: [PATCH] feat: Accept durations as timeout arguments --- src/timeout.rs | 16 ++++++++++++++-- tests/realworld.rs | 12 ++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/timeout.rs b/src/timeout.rs index 4458744a9..86a158e6b 100644 --- a/src/timeout.rs +++ b/src/timeout.rs @@ -1,7 +1,7 @@ -use std::{num::ParseIntError, str::FromStr}; +use std::{convert::TryInto, num::ParseIntError, str::FromStr, time::Duration, u128}; /// Describes the timeout of a notification -/// +/// /// # `FromStr` /// You can also parse a `Timeout` from a `&str`. /// ``` @@ -56,6 +56,18 @@ impl From for Timeout { } } +impl From for Timeout { + fn from(duration: Duration) -> Timeout { + if duration.is_zero() { + Timeout::Never + } else if duration.as_millis() > u32::MAX.into() { + Timeout::Default + } else { + Timeout::Milliseconds(duration.as_millis().try_into().unwrap_or(u32::MAX)) + } + } +} + impl From for i32 { fn from(timeout: Timeout) -> Self { match timeout { diff --git a/tests/realworld.rs b/tests/realworld.rs index 81382e8ce..bc5fb6881 100644 --- a/tests/realworld.rs +++ b/tests/realworld.rs @@ -4,6 +4,8 @@ extern crate notify_rust; #[cfg(test)] mod realworld { + use std::time::Duration; + #[cfg(all(feature = "images", unix, not(target_os = "macos")))] use notify_rust::Image; use notify_rust::*; @@ -112,6 +114,16 @@ mod realworld { .unwrap(); } + #[test] + fn should_allow_timeout_with_duration() { + let mut notification = Notification::new(); + notification.timeout(Duration::from_secs(15)); + assert!(matches!( + notification.timeout, + Timeout::Milliseconds(15_000) + )); + } + #[test] #[cfg(all(unix, not(target_os = "macos")))] fn urgency() {