1use std::time::{SystemTime, UNIX_EPOCH};
4
5use crate::{AuthError, Result};
6
7pub trait Clock: Send + Sync {
9 fn now_unix_seconds(&self) -> Result<i64>;
15}
16
17#[derive(Debug, Default, Clone, Copy)]
19pub struct SystemClock;
20
21impl Clock for SystemClock {
22 fn now_unix_seconds(&self) -> Result<i64> {
23 let duration = SystemTime::now()
24 .duration_since(UNIX_EPOCH)
25 .map_err(|_| AuthError::InvalidPolicy)?;
26 i64::try_from(duration.as_secs()).map_err(|_| AuthError::InvalidPolicy)
27 }
28}
29
30#[derive(Debug, Clone, Copy)]
32pub struct FixedClock {
33 seconds: i64,
34}
35
36impl FixedClock {
37 #[must_use]
39 pub const fn new(seconds: i64) -> Self {
40 Self { seconds }
41 }
42
43 #[must_use]
45 pub const fn seconds(self) -> i64 {
46 self.seconds
47 }
48}
49
50impl Clock for FixedClock {
51 fn now_unix_seconds(&self) -> Result<i64> {
52 Ok(self.seconds)
53 }
54}