use std::io;
use std::sync::Arc;
use chunked_wal::ChunkedWal;
use chunked_wal::WalLock;
use crate::ChunkId;
use crate::Config;
use crate::RaftLog;
use crate::RaftLogRecord;
use crate::RaftWalTypes;
use crate::Types;
use crate::raft_log::dump_api::DumpApi;
use crate::types::Segment;
pub struct Dump<T> {
config: Arc<Config>,
_wal_lock: WalLock,
_p: std::marker::PhantomData<T>,
}
impl<T: Types> DumpApi<T> for Dump<T> {
fn write_with<D>(&self, write_record: D) -> Result<(), io::Error>
where D: FnMut(
ChunkId,
u64,
Result<(Segment, RaftLogRecord<T>), io::Error>,
) -> Result<(), io::Error> {
ChunkedWal::<RaftWalTypes<T>>::dump_records(
&self.config.wal,
&self._wal_lock,
write_record,
)
}
}
pub struct RefDump<'a, T: Types> {
pub(crate) raft_log: &'a RaftLog<T>,
}
impl<T: Types> DumpApi<T> for RefDump<'_, T> {
fn write_with<D>(&self, write_record: D) -> Result<(), io::Error>
where D: FnMut(
ChunkId,
u64,
Result<(Segment, RaftLogRecord<T>), io::Error>,
) -> Result<(), io::Error> {
self.raft_log.wal.dump_loaded_records(write_record)
}
}
impl<T: Types> Dump<T> {
pub fn new(config: Arc<Config>) -> Result<Self, io::Error> {
let wal_lock =
ChunkedWal::<RaftWalTypes<T>>::acquire_lock(&config.wal)?;
Ok(Self {
config,
_wal_lock: wal_lock,
_p: std::marker::PhantomData,
})
}
}