diff --git a/src/notify/error.rs b/src/notify/error.rs index c593e47..731d4de 100644 --- a/src/notify/error.rs +++ b/src/notify/error.rs @@ -175,3 +175,18 @@ impl Display for PollTimeoutFromIntError { } impl Error for PollTimeoutFromIntError {} + +#[derive(Debug)] +pub enum MicrosecondsFromDurationError { + NoMicroseconds, +} + +impl Display for MicrosecondsFromDurationError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::NoMicroseconds => write!(f, "Minimal precision is microseconds but no microseconds are within the Duration provided."), + } + } +} + +impl Error for MicrosecondsFromDurationError {} diff --git a/src/notify/mod.rs b/src/notify/mod.rs index 2569150..e043c11 100644 --- a/src/notify/mod.rs +++ b/src/notify/mod.rs @@ -349,10 +349,10 @@ pub enum NotifyState<'a> { /// Tell the service manager to execute the configured watchdog option. WatchdogTrigger, /// Reset watchdog timeout value during runtime. - /// The value is in microseconds. + /// Minimal precision is microseconds, not nanoseconds. WatchdogUsec(types::Microseconds), /// Tells the service manager to extend the startup, runtime or shutdown service timeout corresponding the current state. - /// The value is in microseconds. + /// Minimal precision is microseconds, not nanoseconds. ExtendTimeoutUsec(types::Microseconds), } @@ -373,11 +373,11 @@ impl<'a> Display for NotifyState<'a> { NotifyState::Stopping => f.write_str("STOPPING=1"), NotifyState::Watchdog => f.write_str("WATCHDOG=1"), NotifyState::WatchdogTrigger => f.write_str("WATCHDOG=trigger"), - NotifyState::WatchdogUsec(milliseconds) => { - write!(f, "WATCHDOG_USEC={milliseconds}") + NotifyState::WatchdogUsec(duration) => { + write!(f, "WATCHDOG_USEC={duration}") } - NotifyState::ExtendTimeoutUsec(milliseconds) => { - write!(f, "EXTEND_TIMEOUT_USEC={milliseconds}") + NotifyState::ExtendTimeoutUsec(duration) => { + write!(f, "EXTEND_TIMEOUT_USEC={duration}") } } } diff --git a/src/notify/types.rs b/src/notify/types.rs index a4d6a3c..66de4d4 100644 --- a/src/notify/types.rs +++ b/src/notify/types.rs @@ -1,6 +1,6 @@ //! Newtypes used by [`NotifyState`](super::NotifyState) -use core::fmt::Display; +use core::{fmt::Display, time::Duration}; use super::error; @@ -88,24 +88,22 @@ impl Display for StatusLine<'_> { /// Semantic type representing a number of microseconds. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub struct Microseconds(u64); +pub struct Microseconds(Duration); -impl From for Microseconds { - fn from(value: u64) -> Self { - Self(value) - } -} +impl TryFrom for Microseconds { + type Error = error::MicrosecondsFromDurationError; -impl From for u64 { - fn from(value: Microseconds) -> Self { - value.0 + fn try_from(value: Duration) -> Result { + if value.as_micros() == 0 { + return Err(Self::Error::NoMicroseconds); + } + Ok(Self(value)) } } impl Display for Microseconds { - #[inline] fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - Display::fmt(&self.0, f) + write!(f, "{}", self.0.as_micros()) } }