time/ext/
numerical_duration.rs

1use crate::convert::*;
2use crate::Duration;
3
4/// Sealed trait to prevent downstream implementations.
5mod sealed {
6    /// A trait that cannot be implemented by downstream users.
7    pub trait Sealed {}
8    impl Sealed for i64 {}
9    impl Sealed for f64 {}
10}
11
12/// Create [`Duration`]s from numeric literals.
13///
14/// # Examples
15///
16/// Basic construction of [`Duration`]s.
17///
18/// ```rust
19/// # use time::{Duration, ext::NumericalDuration};
20/// assert_eq!(5.nanoseconds(), Duration::nanoseconds(5));
21/// assert_eq!(5.microseconds(), Duration::microseconds(5));
22/// assert_eq!(5.milliseconds(), Duration::milliseconds(5));
23/// assert_eq!(5.seconds(), Duration::seconds(5));
24/// assert_eq!(5.minutes(), Duration::minutes(5));
25/// assert_eq!(5.hours(), Duration::hours(5));
26/// assert_eq!(5.days(), Duration::days(5));
27/// assert_eq!(5.weeks(), Duration::weeks(5));
28/// ```
29///
30/// Signed integers work as well!
31///
32/// ```rust
33/// # use time::{Duration, ext::NumericalDuration};
34/// assert_eq!((-5).nanoseconds(), Duration::nanoseconds(-5));
35/// assert_eq!((-5).microseconds(), Duration::microseconds(-5));
36/// assert_eq!((-5).milliseconds(), Duration::milliseconds(-5));
37/// assert_eq!((-5).seconds(), Duration::seconds(-5));
38/// assert_eq!((-5).minutes(), Duration::minutes(-5));
39/// assert_eq!((-5).hours(), Duration::hours(-5));
40/// assert_eq!((-5).days(), Duration::days(-5));
41/// assert_eq!((-5).weeks(), Duration::weeks(-5));
42/// ```
43///
44/// Just like any other [`Duration`], they can be added, subtracted, etc.
45///
46/// ```rust
47/// # use time::ext::NumericalDuration;
48/// assert_eq!(2.seconds() + 500.milliseconds(), 2_500.milliseconds());
49/// assert_eq!(2.seconds() - 500.milliseconds(), 1_500.milliseconds());
50/// ```
51///
52/// When called on floating point values, any remainder of the floating point value will be
53/// truncated. Keep in mind that floating point numbers are inherently imprecise and have
54/// limited capacity.
55pub trait NumericalDuration: sealed::Sealed {
56    /// Create a [`Duration`] from the number of nanoseconds.
57    fn nanoseconds(self) -> Duration;
58    /// Create a [`Duration`] from the number of microseconds.
59    fn microseconds(self) -> Duration;
60    /// Create a [`Duration`] from the number of milliseconds.
61    fn milliseconds(self) -> Duration;
62    /// Create a [`Duration`] from the number of seconds.
63    fn seconds(self) -> Duration;
64    /// Create a [`Duration`] from the number of minutes.
65    fn minutes(self) -> Duration;
66    /// Create a [`Duration`] from the number of hours.
67    fn hours(self) -> Duration;
68    /// Create a [`Duration`] from the number of days.
69    fn days(self) -> Duration;
70    /// Create a [`Duration`] from the number of weeks.
71    fn weeks(self) -> Duration;
72}
73
74impl NumericalDuration for i64 {
75    fn nanoseconds(self) -> Duration {
76        Duration::nanoseconds(self)
77    }
78
79    fn microseconds(self) -> Duration {
80        Duration::microseconds(self)
81    }
82
83    fn milliseconds(self) -> Duration {
84        Duration::milliseconds(self)
85    }
86
87    fn seconds(self) -> Duration {
88        Duration::seconds(self)
89    }
90
91    fn minutes(self) -> Duration {
92        Duration::minutes(self)
93    }
94
95    fn hours(self) -> Duration {
96        Duration::hours(self)
97    }
98
99    fn days(self) -> Duration {
100        Duration::days(self)
101    }
102
103    fn weeks(self) -> Duration {
104        Duration::weeks(self)
105    }
106}
107
108impl NumericalDuration for f64 {
109    fn nanoseconds(self) -> Duration {
110        Duration::nanoseconds(self as _)
111    }
112
113    fn microseconds(self) -> Duration {
114        Duration::nanoseconds((self * Nanosecond::per(Microsecond) as Self) as _)
115    }
116
117    fn milliseconds(self) -> Duration {
118        Duration::nanoseconds((self * Nanosecond::per(Millisecond) as Self) as _)
119    }
120
121    fn seconds(self) -> Duration {
122        Duration::nanoseconds((self * Nanosecond::per(Second) as Self) as _)
123    }
124
125    fn minutes(self) -> Duration {
126        Duration::nanoseconds((self * Nanosecond::per(Minute) as Self) as _)
127    }
128
129    fn hours(self) -> Duration {
130        Duration::nanoseconds((self * Nanosecond::per(Hour) as Self) as _)
131    }
132
133    fn days(self) -> Duration {
134        Duration::nanoseconds((self * Nanosecond::per(Day) as Self) as _)
135    }
136
137    fn weeks(self) -> Duration {
138        Duration::nanoseconds((self * Nanosecond::per(Week) as Self) as _)
139    }
140}