use core::fmt;
use crate::record::RecordId;
pub type Result<T> = core::result::Result<T, Error>;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Error {
Sink(SinkError),
ChainBroken,
Capacity,
NonMonotonicClock,
HashMismatch(RecordId),
LinkMismatch(RecordId),
IdMismatch(RecordId),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Sink(_) => f.write_str("audit sink failure"),
Self::ChainBroken => f.write_str("audit hash chain broken"),
Self::Capacity => f.write_str("audit capacity exceeded"),
Self::NonMonotonicClock => f.write_str("audit clock not monotonic"),
Self::HashMismatch(id) => write!(f, "audit hash mismatch at record {}", id.as_u64()),
Self::LinkMismatch(id) => write!(f, "audit link mismatch at record {}", id.as_u64()),
Self::IdMismatch(id) => write!(f, "audit id mismatch at record {}", id.as_u64()),
}
}
}
#[cfg(feature = "std")]
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::Sink(inner) => Some(inner),
_ => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum SinkError {
Io,
Capacity,
Closed,
Other,
}
impl fmt::Display for SinkError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Io => f.write_str("sink i/o failure"),
Self::Capacity => f.write_str("sink capacity exceeded"),
Self::Closed => f.write_str("sink closed"),
Self::Other => f.write_str("sink error"),
}
}
}
#[cfg(feature = "std")]
impl std::error::Error for SinkError {}
impl From<SinkError> for Error {
#[inline]
fn from(value: SinkError) -> Self {
Self::Sink(value)
}
}