use anyerror::AnyError;
use crate::{LogId, ReplicaId, TypeConfig};
use crate::storage::GetFileService;
use crate::util::Closeable;
pub trait SnapshotReader: Closeable + Send + Sync + 'static{
fn read_snapshot_log_id(&self) -> Result<LogId, AnyError>;
fn generate_reader_id(&self) -> Result<usize, AnyError>;
}
pub trait SnapshotWriter: Closeable + Send + Sync + 'static{
fn write_snapshot_log_id(&mut self, log_id: LogId) -> Result<(), AnyError>;
fn flush(&mut self) -> Result<(), AnyError> {
Ok(())
}
}
pub trait SnapshotDownloader: Send + Sync + 'static {
fn download(&mut self) -> impl std::future::Future<Output=Result<(), AnyError>> + Send;
}
pub trait SnapshotStorage<C>: Send + Sync + 'static
where C: TypeConfig {
type Reader: SnapshotReader;
type Writer: SnapshotWriter;
type Downloader: SnapshotDownloader;
type FileService: GetFileService<C>;
fn open_reader(&mut self) -> Result<Option<Self::Reader>, AnyError>;
fn open_writer(&mut self) -> Result<Self::Writer, AnyError>;
fn open_downloader(&mut self, target_id: ReplicaId<C::NodeId>, reader_id: usize) -> Result<Self::Downloader, AnyError>;
fn file_service(&self) -> Result<Self::FileService, AnyError>;
}