use std::collections::HashMap;
use std::hash::Hash;
use std::time;
use std::time::SystemTime;
pub struct Cache<K, V> {
data: HashMap<K, (V, u64)>,
max_ttl: u64,
}
impl<K, V> Cache<K, V>
where
K: Eq + Hash,
V: Clone,
{
pub fn new(max_ttl: u64) -> Self {
Cache {
data: HashMap::new(),
max_ttl,
}
}
fn validate_ttl(&self, ttl: u64) -> bool {
let now = SystemTime::now();
let since_epoch = now
.duration_since(time::UNIX_EPOCH)
.expect("Time went backwards");
let secs = since_epoch.as_secs();
secs < ttl
}
fn get_ttl(&self) -> u64 {
let now = SystemTime::now();
let since_epoch = now
.duration_since(time::UNIX_EPOCH)
.expect("Time went backwards");
let secs = since_epoch.as_secs();
secs + self.max_ttl
}
pub fn set(&mut self, key: K, data: V) {
self.data.insert(key, (data, self.get_ttl()));
}
pub fn get(&mut self, key: &K) -> Option<V> {
let r = self.data.get(&key);
if r.is_some() {
let (data, ttl) = r.unwrap();
if self.validate_ttl(*ttl) {
Some(data.clone())
} else {
self.data.remove(&key);
None
}
} else {
None
}
}
}