mod base64;
mod concrete;
mod entry;
mod snapshot;
mod util;
pub use concrete::*;
pub use entry::*;
pub use snapshot::*;
pub use util::*;
use serde::{Deserialize, Serialize};
use std::{ops::Deref, str::FromStr};
#[derive(Debug)]
pub struct LogWriteResult {
pub record_start: u64,
pub record_end: u64,
}
impl LogWriteResult {
pub fn record_size(&self) -> u64 {
self.record_end - self.record_start
}
}
#[allow(unused_variables)]
pub trait WritableJournal: std::fmt::Debug {
fn write<'a>(&'a self, entry: JournalEntry<'a>) -> anyhow::Result<LogWriteResult>;
fn flush(&self) -> anyhow::Result<()>;
fn commit(&self) -> anyhow::Result<usize> {
Ok(0)
}
fn rollback(&self) -> anyhow::Result<usize> {
Ok(0)
}
}
#[derive(Debug)]
pub struct LogReadResult<'a> {
pub record_start: u64,
pub record_end: u64,
pub record: JournalEntry<'a>,
}
impl<'a> LogReadResult<'a> {
pub fn into_inner(self) -> JournalEntry<'a> {
self.record
}
}
impl<'a> Deref for LogReadResult<'a> {
type Target = JournalEntry<'a>;
fn deref(&self) -> &Self::Target {
&self.record
}
}
#[allow(unused_variables)]
pub trait ReadableJournal: std::fmt::Debug {
fn read(&self) -> anyhow::Result<Option<LogReadResult<'_>>>;
fn as_restarted(&self) -> anyhow::Result<Box<DynReadableJournal>>;
}
#[allow(unused_variables)]
pub trait Journal:
WritableJournal + ReadableJournal + AsDynReadableJournal + std::fmt::Debug
{
fn split(self) -> (Box<DynWritableJournal>, Box<DynReadableJournal>);
}
pub type DynJournal = dyn Journal + Send + Sync;
pub type DynWritableJournal = dyn WritableJournal + Send + Sync;
pub type DynReadableJournal = dyn ReadableJournal + Send + Sync;
pub trait AsDynReadableJournal {
fn as_dyn_readable_journal(&self) -> &DynReadableJournal;
}
impl<T: Journal + Send + Sync + 'static> AsDynReadableJournal for T {
fn as_dyn_readable_journal(&self) -> &DynReadableJournal {
self
}
}