use dupe::Dupe;
use crate::Pagable;
use crate::context::PagableDeserializerImpl;
use crate::pagable_arc::PagableArc;
use crate::storage::data::DataKey;
use crate::storage::traits::PagableStorage;
#[derive(Clone, Dupe)]
pub struct PagableStorageHandle {
backing_storage: std::sync::Arc<dyn PagableStorage>,
}
impl PagableStorageHandle {
pub async fn deserialize_pagable_data<T: Pagable>(&self, key: &DataKey) -> anyhow::Result<T> {
let data = self.backing_storage.fetch_data(key).await?;
let mut deserializer = PagableDeserializerImpl::new(&data.data, &data.arcs, self);
T::pagable_deserialize(&mut deserializer)
}
pub fn schedule_for_paging<T: Pagable>(&self, data: PagableArc<T>) {
let boxed = Box::new(data);
self.backing_storage.schedule_for_paging(boxed as _)
}
pub fn new(backing_storage: std::sync::Arc<dyn PagableStorage>) -> Self {
Self { backing_storage }
}
pub(crate) fn backing_storage(&self) -> &dyn PagableStorage {
&*self.backing_storage
}
}