samod_core/
unix_timestamp.rs1use 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}