use time::{Duration, PrimitiveDateTime, Time};
pub use time::{Date, OffsetDateTime};
pub trait EcashTime {
fn ecash_unix_timestamp(&self) -> u32 {
let ts = self.ecash_datetime().unix_timestamp();
assert!(ts > 0);
assert!(ts <= u32::MAX as i64);
ts as u32
}
fn ecash_date(&self) -> Date {
self.ecash_datetime().date()
}
fn ecash_datetime(&self) -> OffsetDateTime;
}
impl EcashTime for OffsetDateTime {
fn ecash_datetime(&self) -> OffsetDateTime {
self.replace_time(Time::MIDNIGHT)
}
}
impl EcashTime for PrimitiveDateTime {
fn ecash_datetime(&self) -> OffsetDateTime {
self.assume_utc().ecash_datetime()
}
}
impl EcashTime for Date {
fn ecash_datetime(&self) -> OffsetDateTime {
OffsetDateTime::new_utc(*self, Time::MIDNIGHT)
}
}
pub fn ecash_today() -> OffsetDateTime {
OffsetDateTime::now_utc().ecash_datetime()
}
pub fn ecash_today_date() -> Date {
ecash_today().ecash_date()
}
pub fn ecash_date_offset(offset: i8) -> OffsetDateTime {
let today = ecash_today();
let day = today + Duration::days(offset as i64);
day.replace_time(Time::MIDNIGHT)
}
#[cfg(feature = "expiration")]
pub fn cred_exp_date() -> OffsetDateTime {
ecash_date_offset(nym_compact_ecash::constants::CRED_VALIDITY_PERIOD_DAYS as i8 - 1)
}
#[cfg(feature = "expiration")]
pub fn ecash_default_expiration_date() -> Date {
cred_exp_date().ecash_date()
}