use wdev::Device;
use super::super::{mainstore::advanced_ops::StringRMWOp, storage_session::StorageSession};
use crate::api::garnet_status::GarnetStatus;
#[derive(Debug, Clone, Copy)]
pub enum UnifiedRMWOp<'k> {
String(StringRMWOp<'k>),
ExpireMs(u64),
ExpireAtMs(u64),
Persist,
}
impl<'a, D: Device> StorageSession<'a, D> {
pub async fn read_unified_store(
&self,
key: &[u8],
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
self.read_main_store(key).await
}
pub async fn rmw_unified_store(
&self,
key: &[u8],
op: UnifiedRMWOp<'_>,
) -> wkv::Result<GarnetStatus> {
match op {
UnifiedRMWOp::String(s) => {
let (status, _) = self.rmw_main_store(key, s).await?;
Ok(status)
}
UnifiedRMWOp::ExpireMs(ttl) => {
let set = self.expire_in_ms(key, ttl).await?;
Ok(if set == 1 {
GarnetStatus::Ok
} else {
GarnetStatus::NotFound
})
}
UnifiedRMWOp::ExpireAtMs(at) => {
let set = self.expire_at_ms(key, at).await?;
Ok(if set == 1 {
GarnetStatus::Ok
} else {
GarnetStatus::NotFound
})
}
UnifiedRMWOp::Persist => {
let removed = self.persist_key(key).await?;
Ok(if removed == 1 {
GarnetStatus::Ok
} else {
GarnetStatus::NotFound
})
}
}
}
}