cas_object/src/error.rs (46 lines of code) (raw):
use std::convert::Infallible;
use thiserror::Error;
use tracing::warn;
#[non_exhaustive]
#[derive(Error, Debug)]
pub enum CasObjectError {
#[error("Invalid Range Read")]
InvalidRange,
#[error("Invalid Arguments")]
InvalidArguments,
#[error("Format Error: {0}")]
FormatError(anyhow::Error),
#[error("Hash Mismatch")]
HashMismatch,
#[error("Internal IO Error: {0}")]
InternalIOError(#[from] std::io::Error),
#[error("Other Internal Error: {0}")]
InternalError(anyhow::Error),
#[error("(De)Compression Error: {0}")]
CompressionError(#[from] lz4_flex::frame::Error),
#[error("Internal Hash Parsing Error")]
HashParsingError(#[from] Infallible),
#[error("ChunkHeaderParseErrorFooterIdent")]
ChunkHeaderParseErrorFooterIdent,
}
// Define our own result type here (this seems to be the standard).
pub type Result<T> = std::result::Result<T, CasObjectError>;
impl PartialEq for CasObjectError {
fn eq(&self, other: &CasObjectError) -> bool {
std::mem::discriminant(self) == std::mem::discriminant(other)
}
}
/// Helper trait to swallow CAS object format errors. Used in object
/// validation to reject the object instead of propagating errors.
pub trait Validate<T> {
fn ok_for_format_error(self) -> Result<Option<T>>;
}
impl<T> Validate<T> for Result<T> {
fn ok_for_format_error(self) -> Result<Option<T>> {
match self {
Ok(v) => Ok(Some(v)),
Err(CasObjectError::FormatError(e)) => {
warn!("XORB Validation: {e}");
Ok(None)
},
Err(e) => Err(e),
}
}
}