use serde::{Serialize, de::DeserializeOwned};
use crate::{GraphId, Location, StorageError};
pub trait IoManager {
type Writer: Write;
fn create(&mut self, id: GraphId) -> Result<Self::Writer, StorageError>;
fn open(&mut self, id: GraphId) -> Result<Option<Self::Writer>, StorageError>;
fn remove(&mut self, id: GraphId) -> Result<(), StorageError>;
fn list(&mut self)
-> Result<impl Iterator<Item = Result<GraphId, StorageError>>, StorageError>;
}
pub trait Write {
type ReadOnly: Read;
fn readonly(&self) -> Self::ReadOnly;
fn head(&self) -> Result<Location, StorageError>;
fn append<F, T>(&mut self, builder: F) -> Result<T, StorageError>
where
F: FnOnce(u64) -> T,
T: Serialize;
fn commit(&mut self, head: Location) -> Result<(), StorageError>;
}
pub trait Read: Clone {
fn fetch<T>(&self, offset: u64) -> Result<T, StorageError>
where
T: DeserializeOwned;
}