use bytes::Bytes;
use serde::{Deserialize, Serialize};
use std::time::{SystemTime, UNIX_EPOCH};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(super) struct CacheEntry {
#[serde(with = "serde_bytes_helper")]
pub(super) result: Bytes,
pub(super) etag: String,
pub(super) created_at: i64,
pub(super) ttl_seconds: u64,
pub(super) last_accessed: i64,
pub(super) size_bytes: usize,
}
impl CacheEntry {
pub(super) fn is_expired(&self) -> bool {
if self.ttl_seconds == 0 {
return false;
}
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_secs() as i64)
.unwrap_or(0);
now - self.created_at > self.ttl_seconds as i64
}
pub(super) fn touch(&mut self) {
self.last_accessed = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_secs() as i64)
.unwrap_or(0);
}
}
pub(super) mod serde_bytes_helper {
use bytes::Bytes;
use serde::{Deserialize, Deserializer, Serializer};
pub fn serialize<S>(bytes: &Bytes, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_bytes(bytes.as_ref())
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Bytes, D::Error>
where
D: Deserializer<'de>,
{
let vec: Vec<u8> = Vec::deserialize(deserializer)?;
Ok(Bytes::from(vec))
}
}