use serde::{de::DeserializeOwned, Deserialize, Serialize};
pub const COMPRESSION_THRESHOLD: usize = 1024;
#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum CompressionMethod {
#[default]
Zlib,
Lzma2,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetItemOptions {
pub ttl: Option<u64>,
pub compress: Option<bool>,
pub compression_method: Option<CompressionMethod>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CacheItem<T> {
pub value: T,
pub expires_at: Option<u64>,
pub is_compressed: Option<bool>,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SetRequest<T>
where
T: Serialize + DeserializeOwned,
{
pub key: String,
pub value: T,
pub options: Option<SetItemOptions>,
}
impl<'de, T> serde::Deserialize<'de> for SetRequest<T>
where
T: Serialize + DeserializeOwned,
{
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
#[derive(Deserialize)]
struct Helper {
key: String,
value: serde_json::Value,
options: Option<SetItemOptions>,
}
let helper = Helper::deserialize(deserializer)?;
let value = serde_json::from_value(helper.value).map_err(serde::de::Error::custom)?;
Ok(SetRequest {
key: helper.key,
value,
options: helper.options,
})
}
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetRequest {
pub key: String,
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RemoveRequest {
pub key: String,
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct HasRequest {
pub key: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CacheStats {
pub total_size: usize,
pub active_size: usize,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BooleanResponse {
pub value: bool,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct EmptyResponse {}
#[derive(Clone, Serialize, Deserialize, Debug)]
pub struct CompressionConfig {
pub enabled: bool,
pub level: u32,
pub threshold: usize,
pub method: CompressionMethod,
}
impl Default for CompressionConfig {
fn default() -> Self {
Self {
enabled: false,
level: 6, threshold: COMPRESSION_THRESHOLD,
method: CompressionMethod::Zlib,
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CacheConfig {
pub cache_dir: Option<String>,
pub cache_file_name: Option<String>,
pub cleanup_interval: Option<u64>,
pub default_compression: Option<bool>,
pub compression_level: Option<u32>,
pub compression_threshold: Option<usize>,
pub compression_method: Option<CompressionMethod>,
}
impl Default for CacheConfig {
fn default() -> Self {
Self {
cache_dir: None,
cache_file_name: None,
cleanup_interval: Some(60), default_compression: Some(true), compression_level: Some(6), compression_threshold: Some(1024), compression_method: Some(CompressionMethod::Zlib), }
}
}