use wdev::Device;
use crate::{
api::garnet_status::GarnetStatus,
storage::session::{
mainstore::advanced_ops::{RmwResult, StringRMWOp},
objectstore::common::RmwOutcome,
storage_session::StorageSession,
unifiedstore::advanced_ops::UnifiedRMWOp,
},
};
pub struct IGarnetAdvancedApi;
impl IGarnetAdvancedApi {
pub async fn get__with_pending<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>, bool)> {
ss.get_with_pending(key).await
}
pub fn get__complete_pending<D: Device>(ss: &StorageSession<'_, D>) -> bool {
ss.get_complete_pending()
}
pub async fn rmw__main_store<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
op: StringRMWOp<'_>,
) -> wkv::Result<RmwResult> {
ss.rmw_main_store(key, op).await
}
pub async fn read__main_store<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.read_main_store(key).await
}
pub async fn rmw__object_store<D: Device, R>(
ss: &StorageSession<'_, D>,
key: &[u8],
tag: u8,
on_load: impl FnOnce(Option<Vec<u8>>) -> Option<(Vec<u8>, R)>,
) -> wkv::Result<RmwOutcome<R>> {
ss.rmw_object_store(key, tag, on_load).await
}
pub async fn read__object_store<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
tag: u8,
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.read_object_store(key, tag).await
}
pub async fn rmw__unified_store<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
op: UnifiedRMWOp<'_>,
) -> wkv::Result<GarnetStatus> {
ss.rmw_unified_store(key, op).await
}
pub async fn read__unified_store<D: Device>(
ss: &StorageSession<'_, D>,
key: &[u8],
) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
ss.read_unified_store(key).await
}
pub async fn read_with_prefetch<D: Device, K: AsRef<[u8]>>(
ss: &StorageSession<'_, D>,
keys: &[K],
on_item: impl FnMut(usize, Option<&[u8]>),
) -> wkv::Result<()> {
ss.read_with_prefetch(keys, on_item).await
}
}