diff --git a/src/timeout.rs b/src/timeout.rs index 4458744a9..179f951e6 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,21 @@ impl From for Timeout { } } +impl From for Timeout { + fn from(duration: Duration) -> Timeout { + if duration.is_zero() { + Timeout::Never + } else { + match duration.as_millis().cmp(&(u32::MAX as u128)) { + std::cmp::Ordering::Less => { + Timeout::Milliseconds(duration.as_millis().try_into().unwrap_or(u32::MAX)) + } + _ => Timeout::Default, + } + } + } +} + 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() {