Coverage Report

Created: 2026-07-14 07:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/jiff-0.2.32/src/now.rs
Line
Count
Source
1
/*!
2
Provides a centralized helper for getting the current system time.
3
4
We generally rely on the standard library for this, but the standard library
5
(by design) does not provide this for the `wasm{32,64}-unknown-unknown`
6
targets. Instead, Jiff provides an opt-in `js` feature that only applies on the
7
aforementioned target. Specifically, when enabled, it assumes a web context and
8
runs JavaScript code to get the current time.
9
10
This also exposes a "fallible" API for querying monotonic time. Since we only
11
use monotonic time for managing expiration for caches, in the case where we
12
can't get monotonic time (easily), we just consider the cache to always be
13
expired. ¯\_(ツ)_/¯
14
*/
15
16
pub(crate) use self::sys::*;
17
18
#[cfg(not(all(
19
    feature = "js",
20
    any(target_arch = "wasm32", target_arch = "wasm64"),
21
    target_os = "unknown"
22
)))]
23
mod sys {
24
0
    pub(crate) fn system_time() -> std::time::SystemTime {
25
        // `SystemTime::now()` should continue to panic on this exact target in
26
        // the future as well; Instead of letting `std` panic, we panic first
27
        // with a more informative error message.
28
0
        if cfg!(all(
29
            not(feature = "js"),
30
            any(target_arch = "wasm32", target_arch = "wasm64"),
31
            target_os = "unknown"
32
        )) {
33
0
            panic!(
34
                "getting the current time in wasm32-unknown-unknown \
35
                 is not possible with just the standard library, \
36
                 enable Jiff's `js` feature if you are \
37
                 targeting a browser environment",
38
            );
39
        } else {
40
0
            std::time::SystemTime::now()
41
        }
42
0
    }
43
44
    #[cfg(any(
45
        feature = "tz-system",
46
        feature = "tzdb-zoneinfo",
47
        feature = "tzdb-concatenated"
48
    ))]
49
2
    pub(crate) fn monotonic_time() -> Option<std::time::Instant> {
50
        // Same reasoning as above, but we return `None` instead of panicking,
51
        // because Jiff can deal with environments that don't provide
52
        // monotonic time.
53
2
        if cfg!(all(
54
            not(feature = "js"),
55
            any(target_arch = "wasm32", target_arch = "wasm64"),
56
            target_os = "unknown"
57
        )) {
58
0
            None
59
        } else {
60
2
            Some(std::time::Instant::now())
61
        }
62
2
    }
63
}
64
65
#[cfg(all(
66
    feature = "js",
67
    any(target_arch = "wasm32", target_arch = "wasm64"),
68
    target_os = "unknown"
69
))]
70
mod sys {
71
    pub(crate) fn system_time() -> std::time::SystemTime {
72
        use std::time::{Duration, SystemTime};
73
74
        let millis = js_sys::Date::new_0().get_time();
75
        let is_positive = millis.is_sign_positive();
76
        let millis = millis.abs() as u64;
77
        let duration = Duration::from_millis(millis);
78
        let result = if is_positive {
79
            SystemTime::UNIX_EPOCH.checked_add(duration)
80
        } else {
81
            SystemTime::UNIX_EPOCH.checked_sub(duration)
82
        };
83
        // It's a little sad that we have to panic here, but the
84
        // standard SystemTime::now() API is infallible, so we kind
85
        // of have to match it. With that said, a panic here would be
86
        // highly unusual. It would imply that the system time is set
87
        // to some extreme timestamp very far in the future or the
88
        // past.
89
        let Some(timestamp) = result else {
90
            panic!(
91
                "failed to get current time from Javascript date: \
92
                 arithmetic on Unix epoch overflowed"
93
            )
94
        };
95
        timestamp
96
    }
97
98
    #[cfg(any(
99
        feature = "tz-system",
100
        feature = "tzdb-zoneinfo",
101
        feature = "tzdb-concatenated"
102
    ))]
103
    pub(crate) fn monotonic_time() -> Option<std::time::Instant> {
104
        // :-(
105
        None
106
    }
107
}