samod_core/
unix_timestamp.rs

1use std::{
2    ops::{Add, AddAssign, Sub},
3    time::{Duration, SystemTime, UNIX_EPOCH},
4};
5
6#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
7pub struct UnixTimestamp {
8    millis: u128,
9}
10
11impl std::fmt::Display for UnixTimestamp {
12    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13        write!(f, "{}", self.millis)
14    }
15}
16
17impl std::fmt::Debug for UnixTimestamp {
18    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
19        write!(f, "{}", self.millis)
20    }
21}
22
23impl UnixTimestamp {
24    pub fn now() -> Self {
25        Self {
26            millis: SystemTime::now()
27                .duration_since(UNIX_EPOCH)
28                .unwrap()
29                .as_millis(),
30        }
31    }
32
33    pub fn as_millis(&self) -> u128 {
34        self.millis
35    }
36}
37
38impl From<UnixTimestamp> for i64 {
39    fn from(ts: UnixTimestamp) -> i64 {
40        ts.millis as i64
41    }
42}
43
44impl AddAssign<Duration> for UnixTimestamp {
45    fn add_assign(&mut self, rhs: Duration) {
46        self.millis += rhs.as_millis();
47    }
48}
49
50impl Add<Duration> for UnixTimestamp {
51    type Output = Self;
52
53    fn add(self, rhs: Duration) -> Self::Output {
54        Self {
55            millis: self.millis + rhs.as_millis(),
56        }
57    }
58}
59
60impl Sub<Duration> for UnixTimestamp {
61    type Output = Self;
62
63    fn sub(self, rhs: Duration) -> Self::Output {
64        Self {
65            millis: self.millis - rhs.as_millis(),
66        }
67    }
68}
69
70impl Sub<UnixTimestamp> for UnixTimestamp {
71    type Output = Duration;
72
73    fn sub(self, rhs: Self) -> Self::Output {
74        let diff = self.millis - rhs.millis;
75        Duration::from_millis(diff as u64)
76    }
77}