use std::io;
use serde::{Serialize, de::DeserializeOwned};
use smart_default::SmartDefault;
use crate::utils::ByteSize;
#[derive(Debug, Display, Error, From)]
pub enum JournalError {
#[display("i/o error: {_0}")]
Io(io::Error),
#[display("encode error: {_0}")]
Encode(bincode::Error),
#[display("journal checksum mismatch: potential corruption")]
Checksum,
#[display("invalid magic number")]
InvalidMagic,
#[display("journal worker died")]
WorkerDied,
}
#[derive(Debug, Clone, SmartDefault)]
#[debug("JournalConfig({:?} => {}x)", ByteSize(*growth_baseline), growth_factor)]
pub struct JournalConfig {
#[default(2)]
pub growth_factor: u64,
#[default(64 * 1024 * 1024)]
pub growth_baseline: u64,
}
pub trait Replayable: 'static {
type Edit: Serialize + DeserializeOwned;
fn apply(&mut self, edit: Self::Edit);
fn snapshot(&self) -> Self::Edit;
fn filename_prefix() -> &'static str;
fn initial() -> Self;
}