use openraft_macros::add_async_trait;
use crate::RaftLogReader;
use crate::RaftTypeConfig;
use crate::StorageError;
use crate::entry::RaftEntry;
use crate::errors::StorageIOResult;
use crate::type_config::TypeConfigExt;
use crate::type_config::alias::LogIdOf;
#[add_async_trait]
pub trait RaftLogReaderExt<C>: RaftLogReader<C>
where C: RaftTypeConfig
{
async fn try_get_log_entry(&mut self, log_index: u64) -> Result<Option<C::Entry>, StorageError<C>> {
let mut res = self.try_get_log_entries(log_index..(log_index + 1)).await.sto_read_logs()?;
Ok(res.pop())
}
async fn get_log_id(&mut self, log_index: u64) -> Result<LogIdOf<C>, StorageError<C>> {
let entries = self.try_get_log_entries(log_index..=log_index).await.sto_read_logs()?;
if entries.is_empty() {
return Err(StorageError::read_log_at_index(
log_index,
C::err_from_string("log entry not found"),
));
}
Ok(entries[0].log_id())
}
}
impl<C, LR> RaftLogReaderExt<C> for LR
where
C: RaftTypeConfig,
LR: RaftLogReader<C> + ?Sized,
{
}