use std::io;
use openraft_macros::add_async_trait;
use openraft_macros::since;
use crate::OptionalSend;
use crate::OptionalSync;
use crate::RaftLogReader;
use crate::RaftTypeConfig;
use crate::storage::IOFlushed;
use crate::storage::LogState;
use crate::type_config::alias::LogIdOf;
use crate::type_config::alias::VoteOf;
#[add_async_trait]
pub trait RaftLogStorage<C>: OptionalSend + OptionalSync + 'static
where C: RaftTypeConfig
{
type LogReader: RaftLogReader<C>;
async fn get_log_state(&mut self) -> Result<LogState<C>, io::Error>;
async fn get_log_reader(&mut self) -> Self::LogReader;
async fn save_vote(&mut self, vote: &VoteOf<C>) -> Result<(), io::Error>;
async fn save_committed(&mut self, _committed: Option<LogIdOf<C>>) -> Result<(), io::Error> {
Ok(())
}
async fn read_committed(&mut self) -> Result<Option<LogIdOf<C>>, io::Error> {
Ok(None)
}
async fn append<I>(&mut self, entries: I, callback: IOFlushed<C>) -> Result<(), io::Error>
where
I: IntoIterator<Item = C::Entry> + OptionalSend,
I::IntoIter: OptionalSend;
#[since(version = "0.10.0")]
async fn truncate_after(&mut self, last_log_id: Option<LogIdOf<C>>) -> Result<(), io::Error>;
async fn purge(&mut self, log_id: LogIdOf<C>) -> Result<(), io::Error>;
}