use std::fmt; use std::ops::Deref; use std::str::FromStr; use std::time::{Duration as StdDuration, SystemTime}; use crate::date::{self, format_rfc3339, parse_rfc3339_weak}; use crate::duration::{self, format_duration, parse_duration}; /// A wrapper for duration that has `FromStr` implementation /// /// This is useful if you want to use it somewhere where `FromStr` is /// expected. /// /// See `parse_duration` for the description of the format. /// /// # Example /// /// ``` /// use std::time::Duration; /// let x: Duration; /// x = "12h 5min 2ns".parse::().unwrap().into(); /// assert_eq!(x, Duration::new(12*3600 + 5*60, 2)) /// ``` /// #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] pub struct Duration(StdDuration); /// A wrapper for SystemTime that has `FromStr` implementation /// /// This is useful if you want to use it somewhere where `FromStr` is /// expected. /// /// See `parse_rfc3339_weak` for the description of the format. The "weak" /// format is used as it's more pemissive for human input as this is the /// expected use of the type (e.g. command-line parsing). /// /// # Example /// /// ``` /// use std::time::SystemTime; /// let x: SystemTime; /// x = "2018-02-16T00:31:37Z".parse::().unwrap().into(); /// assert_eq!(humantime::format_rfc3339(x).to_string(), "2018-02-16T00:31:37Z"); /// ``` /// #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct Timestamp(SystemTime); impl Duration { /// Create a new instance from a [`StdDuration`]. This can be used in a `const` context. /// /// ```rust /// # use humantime::Duration; /// const DEFAULT_TIMEOUT: Duration = Duration::new(core::time::Duration::from_secs(60)); /// ``` pub const fn new(value: StdDuration) -> Self { Self(value) } } impl AsRef for Duration { fn as_ref(&self) -> &StdDuration { &self.0 } } impl Deref for Duration { type Target = StdDuration; fn deref(&self) -> &StdDuration { &self.0 } } impl From for StdDuration { fn from(val: Duration) -> Self { val.0 } } impl From for Duration { fn from(dur: StdDuration) -> Duration { Duration(dur) } } impl FromStr for Duration { type Err = duration::Error; fn from_str(s: &str) -> Result { parse_duration(s).map(Duration) } } impl fmt::Display for Duration { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { format_duration(self.0).fmt(f) } } impl AsRef for Timestamp { fn as_ref(&self) -> &SystemTime { &self.0 } } impl Deref for Timestamp { type Target = SystemTime; fn deref(&self) -> &SystemTime { &self.0 } } impl From for SystemTime { fn from(val: Timestamp) -> Self { val.0 } } impl From for Timestamp { fn from(dur: SystemTime) -> Timestamp { Timestamp(dur) } } impl FromStr for Timestamp { type Err = date::Error; fn from_str(s: &str) -> Result { parse_rfc3339_weak(s).map(Timestamp) } } impl fmt::Display for Timestamp { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { format_rfc3339(self.0).fmt(f) } }