pub mod pod;
pub mod serde;
pub(crate) mod traits;
pub use pod::{PodStore, PodStoreBuilder};
pub use serde::{SerdeStore, SerdeStoreBuilder};
pub use traits::PayloadBuilderOps;
use crate::error::Result;
#[doc(hidden)]
pub trait OwnedPayloadStore<T> {
fn fetch_owned(&self, id: u32) -> Result<T>;
fn fetch_many_owned(&self, ids: &[u32]) -> Result<Vec<T>> {
ids.iter().map(|&id| self.fetch_owned(id)).collect()
}
}
#[doc(hidden)]
pub trait RefPayloadStore<T> {
fn fetch_ref(&self, id: u32) -> &T;
fn fetch_many_ref(&self, ids: &[u32]) -> Vec<&T> {
ids.iter().map(|&id| self.fetch_ref(id)).collect()
}
}
pub trait Payload: Sized {
type Store: OwnedPayloadStore<Self>;
type Builder: PayloadBuilderOps<Self, Store = Self::Store>;
fn make_builder() -> Result<Self::Builder>;
fn load_store(dir: &std::path::Path) -> Result<Self::Store>;
}
impl Payload for () {
type Store = SerdeStore<()>;
type Builder = SerdeStoreBuilder<()>;
fn make_builder() -> Result<Self::Builder> {
SerdeStoreBuilder::new()
}
fn load_store(dir: &std::path::Path) -> Result<Self::Store> {
SerdeStore::load(&dir.join("payloads.bin"), &dir.join("offsets.bin"))
}
}