use std::{
marker::PhantomData,
time::{Duration, SystemTime},
};
use crate::timezone::Utc;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Tick<Tz = Utc> {
timestamp: u64,
_marker: PhantomData<Tz>,
}
impl<Tz> Tick<Tz> {
pub fn new(timestamp: u64) -> Self {
Self {
timestamp,
_marker: PhantomData,
}
}
pub fn get_timestamp(&self) -> u64 {
self.timestamp
}
pub(crate) fn signed_duration_since(&self, time: SystemTime) -> Result<Duration, Duration> {
self.system_time()
.duration_since(time)
.map_err(|e| e.duration())
}
pub(crate) fn system_time(&self) -> SystemTime {
SystemTime::UNIX_EPOCH + Duration::from_secs(self.timestamp)
}
}