openraft/storage/
log_store_ext.rs1use std::fmt::Debug;
2use std::ops::RangeBounds;
3
4use openraft_macros::add_async_trait;
5
6use crate::defensive::check_range_matches_entries;
7use crate::LogId;
8use crate::OptionalSend;
9use crate::OptionalSync;
10use crate::RaftLogId;
11use crate::RaftLogReader;
12use crate::RaftTypeConfig;
13use crate::StorageError;
14
15#[add_async_trait]
16pub trait RaftLogReaderExt<C>: RaftLogReader<C>
17where C: RaftTypeConfig
18{
19 async fn try_get_log_entry(&mut self, log_index: u64) -> Result<Option<C::Entry>, StorageError<C::NodeId>> {
23 let mut res = self.try_get_log_entries(log_index..(log_index + 1)).await?;
24 Ok(res.pop())
25 }
26
27 async fn get_log_entries<RB: RangeBounds<u64> + Clone + Debug + OptionalSend + OptionalSync>(
32 &mut self,
33 range: RB,
34 ) -> Result<Vec<C::Entry>, StorageError<C::NodeId>> {
35 let res = self.try_get_log_entries(range.clone()).await?;
36
37 check_range_matches_entries::<C, _>(range, &res)?;
38
39 Ok(res)
40 }
41
42 async fn get_log_id(&mut self, log_index: u64) -> Result<LogId<C::NodeId>, StorageError<C::NodeId>> {
44 let entries = self.get_log_entries(log_index..=log_index).await?;
45
46 Ok(entries[0].get_log_id().clone())
47 }
48}
49
50impl<C, LR> RaftLogReaderExt<C> for LR
51where
52 C: RaftTypeConfig,
53 LR: RaftLogReader<C>,
54{
55}