use std::time::{SystemTime, UNIX_EPOCH};
#[derive(Clone, Copy)]
pub struct CacheItem<T> {
pub value: T,
ttl: u128,
}
impl<T> CacheItem<T> {
pub fn new(value: T, cache_item_ttl: u128) -> Self {
CacheItem {
value,
ttl: current_time_in_nanoseconds() + cache_item_ttl,
}
}
pub fn is_expired(&self) -> bool {
current_time_in_nanoseconds() > self.ttl
}
}
fn current_time_in_nanoseconds() -> u128 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_nanos()
}
#[cfg(test)]
mod tests {
use super::*;
use std::{thread, time};
#[test]
fn cache_item_fresh() {
let cache_item_ttl: u128 = 3600000000000;
let cache_item = CacheItem::new("secret_value", cache_item_ttl);
assert_eq!(cache_item.value, "secret_value");
assert!(!cache_item.is_expired());
}
#[test]
fn cache_item_expired() {
let cache_item = CacheItem::new("secret_value", 0);
let one_hundred_millis = time::Duration::from_millis(100);
thread::sleep(one_hundred_millis);
assert_eq!(cache_item.value, "secret_value");
assert!(cache_item.is_expired());
}
}