parse_frequency/
chrono.rs

1use super::Frequency;
2
3impl Frequency {
4    /// Converts the frequency to a `chrono::Duration`.
5    ///
6    /// # Examples
7    /// ```rust
8    /// use parse_frequency::Frequency;
9    ///
10    /// let freq = Frequency::from_ghz(1);
11    /// let duration = freq.as_chrono_duration();
12    /// assert_eq!(duration.num_nanoseconds(), Some(1));
13    ///
14    /// let freq = Frequency::from_mhz(1);
15    /// let duration = freq.as_chrono_duration();
16    /// assert_eq!(duration.num_nanoseconds(), Some(1_000));
17    /// ````
18    #[must_use]
19    #[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
20    pub fn as_chrono_duration(&self) -> chrono::Duration {
21        if self.0 == 0 {
22            return chrono::Duration::zero();
23        }
24
25        let nanoseconds_per_second: u64 = 1_000_000_000;
26
27        if nanoseconds_per_second >= self.0 {
28            chrono::Duration::nanoseconds((nanoseconds_per_second / self.0) as i64)
29        } else {
30            // If frequency is higher than 1 GHz, the period is less than 1 ns.
31            // Calculate in picoseconds and then convert to nanoseconds.
32            let picoseconds_per_second: u128 = 1_000_000_000_000;
33            let frequency: u128 = u128::from(self.0);
34            let period_in_picoseconds = picoseconds_per_second / frequency;
35            let period_in_nanoseconds = period_in_picoseconds / 1_000;
36            chrono::Duration::nanoseconds(period_in_nanoseconds as i64)
37        }
38    }
39}