use kekbit_codecs::codecs::DataFormat;
use kekbit_codecs::codecs::Encodable;
use std::io::Error;
#[derive(Debug)]
pub enum ChannelError {
InvalidSignature {
expected: u64,
actual: u64,
},
IncompatibleVersion {
expected: u64,
actual: u64,
},
InvalidCapacity {
capacity: u32,
msg: &'static str,
},
InvalidMaxMessageLength {
msg_len: u32,
msg: &'static str,
},
StorageNotFound {
file_name: String,
},
StorageNotReady {
file_name: String,
},
StorageAlreadyExists {
file_name: String,
},
CouldNotAccessStorage {
file_name: String,
},
MemoryMappingFailed {
reason: String,
},
AccessError {
reason: String,
},
}
#[derive(Debug)]
pub enum WriteError {
ChannelFull,
NoSpaceForRecord,
EncodingError(Error),
}
pub trait Writer<D: DataFormat> {
fn write(&mut self, data: &impl Encodable<D>) -> Result<u32, WriteError>;
fn heartbeat(&mut self) -> Result<u32, WriteError>;
fn flush(&mut self) -> Result<(), std::io::Error> {
Ok(())
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum ReadError {
Failed {
bytes_read: u32,
},
Timeout {
timeout: u64,
},
Closed {
bytes_read: u32,
},
ChannelFull {
bytes_read: u32,
},
}
#[derive(Debug)]
pub enum InvalidPosition {
Unaligned { position: u32 },
Unavailable { position: u32 },
}
impl ReadError {
pub fn bytes_read(&self) -> u32 {
match self {
ReadError::Timeout { .. } => 0,
ReadError::Closed { bytes_read } => *bytes_read,
ReadError::ChannelFull { bytes_read } => *bytes_read,
ReadError::Failed { bytes_read } => *bytes_read,
}
}
}
pub trait Reader {
fn read(&mut self, handler: &mut impl FnMut(u32, &[u8]) -> (), message_count: u16) -> Result<u32, ReadError>;
fn move_to(&mut self, position: u32) -> Result<u32, InvalidPosition>;
}