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 from_millis(millis: u128) -> Self {
34        Self { millis }
35    }
36
37    pub fn as_millis(&self) -> u128 {
38        self.millis
39    }
40}
41
42impl From<UnixTimestamp> for i64 {
43    fn from(ts: UnixTimestamp) -> i64 {
44        ts.millis as i64
45    }
46}
47
48impl AddAssign<Duration> for UnixTimestamp {
49    fn add_assign(&mut self, rhs: Duration) {
50        self.millis += rhs.as_millis();
51    }
52}
53
54impl Add<Duration> for UnixTimestamp {
55    type Output = Self;
56
57    fn add(self, rhs: Duration) -> Self::Output {
58        Self {
59            millis: self.millis + rhs.as_millis(),
60        }
61    }
62}
63
64impl Sub<Duration> for UnixTimestamp {
65    type Output = Self;
66
67    fn sub(self, rhs: Duration) -> Self::Output {
68        Self {
69            millis: self.millis - rhs.as_millis(),
70        }
71    }
72}
73
74impl Sub<UnixTimestamp> for UnixTimestamp {
75    type Output = Duration;
76
77    fn sub(self, rhs: Self) -> Self::Output {
78        let diff = self.millis - rhs.millis;
79        Duration::from_millis(diff as u64)
80    }
81}