use std::time::{Duration, Instant as MonotonicInstant};
#[derive(Clone, Copy, Debug)]
pub(crate) struct Expiration(Option<MonotonicInstant>);
impl Expiration {
pub(crate) fn after(ttl: Duration) -> Expiration {
Expiration(
crate::now::monotonic_time().and_then(|now| now.checked_add(ttl)),
)
}
pub(crate) const fn expired() -> Expiration {
Expiration(None)
}
pub(crate) fn is_expired(self) -> bool {
self.0.map_or(true, |t| {
let Some(now) = crate::now::monotonic_time() else { return true };
now > t
})
}
}
impl core::fmt::Display for Expiration {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
let maybe_duration = self.0.and_then(|instant| {
crate::now::monotonic_time()
.and_then(|now| instant.checked_duration_since(now))
});
match maybe_duration {
None => f.write_str("expired"),
Some(duration) => core::fmt::Debug::fmt(&duration, f),
}
}
}