1mod base64;
2mod concrete;
3mod entry;
4mod snapshot;
5mod util;
6
7pub use concrete::*;
8pub use entry::*;
9pub use snapshot::*;
10pub use util::*;
11
12use serde::{Deserialize, Serialize};
13use std::{ops::Deref, str::FromStr};
14
15#[derive(Debug)]
17pub struct LogWriteResult {
18 pub record_start: u64,
20 pub record_end: u64,
22}
23
24impl LogWriteResult {
25 pub fn record_size(&self) -> u64 {
26 self.record_end - self.record_start
27 }
28}
29
30#[allow(unused_variables)]
34pub trait WritableJournal: std::fmt::Debug {
35 fn write<'a>(&'a self, entry: JournalEntry<'a>) -> anyhow::Result<LogWriteResult>;
38
39 fn flush(&self) -> anyhow::Result<()>;
41
42 fn commit(&self) -> anyhow::Result<usize> {
45 Ok(0)
46 }
47
48 fn rollback(&self) -> anyhow::Result<usize> {
51 Ok(0)
52 }
53}
54
55#[derive(Debug)]
57pub struct LogReadResult<'a> {
58 pub record_start: u64,
60 pub record_end: u64,
62 pub record: JournalEntry<'a>,
64}
65
66impl<'a> LogReadResult<'a> {
67 pub fn into_inner(self) -> JournalEntry<'a> {
68 self.record
69 }
70}
71
72impl<'a> Deref for LogReadResult<'a> {
73 type Target = JournalEntry<'a>;
74
75 fn deref(&self) -> &Self::Target {
76 &self.record
77 }
78}
79
80#[allow(unused_variables)]
84pub trait ReadableJournal: std::fmt::Debug {
85 fn read(&self) -> anyhow::Result<Option<LogReadResult<'_>>>;
88
89 fn as_restarted(&self) -> anyhow::Result<Box<DynReadableJournal>>;
92}
93
94#[allow(unused_variables)]
98pub trait Journal:
99 WritableJournal + ReadableJournal + AsDynReadableJournal + std::fmt::Debug
100{
101 fn split(self) -> (Box<DynWritableJournal>, Box<DynReadableJournal>);
103}
104
105pub type DynJournal = dyn Journal + Send + Sync;
106pub type DynWritableJournal = dyn WritableJournal + Send + Sync;
107pub type DynReadableJournal = dyn ReadableJournal + Send + Sync;
108
109pub trait AsDynReadableJournal {
111 fn as_dyn_readable_journal(&self) -> &DynReadableJournal;
112}
113
114impl<T: Journal + Send + Sync + 'static> AsDynReadableJournal for T {
115 fn as_dyn_readable_journal(&self) -> &DynReadableJournal {
116 self
117 }
118}