use std::fmt;
use crate::cost::hill::CostError;
use crate::crypto::aead::CryptoError;
use crate::crypto::expand::ExpandError;
use crate::crypto::kdf::KdfError;
use crate::image_io::phash::PHashError;
use crate::image_io::validate::ValidationError;
use crate::stego::sizer::SizerError;
use crate::stego::stc::StcError;
#[derive(Debug)]
pub enum OutputError {
MalformedBuffer,
EncodingFailed(String),
}
impl fmt::Display for OutputError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
OutputError::MalformedBuffer => write!(
f,
"the stego image buffer does not match its own dimensions and cannot be encoded"
),
OutputError::EncodingFailed(message) => {
write!(f, "failed to write the stego image: {message}")
}
}
}
}
impl std::error::Error for OutputError {}
#[derive(Debug)]
pub enum PipelineError {
Validation(ValidationError),
PHash(PHashError),
Kdf(KdfError),
Expand(ExpandError),
Cost(CostError),
Sizer(SizerError),
Stc(StcError),
Crypto(CryptoError),
Output(OutputError),
}
impl fmt::Display for PipelineError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
PipelineError::Validation(err) => write!(f, "{err}"),
PipelineError::PHash(err) => write!(f, "{err}"),
PipelineError::Kdf(err) => write!(f, "{err}"),
PipelineError::Expand(err) => write!(f, "{err}"),
PipelineError::Cost(err) => write!(f, "{err}"),
PipelineError::Sizer(err) => write!(f, "{err}"),
PipelineError::Stc(err) => write!(f, "{err}"),
PipelineError::Crypto(err) => write!(f, "{err}"),
PipelineError::Output(err) => write!(f, "{err}"),
}
}
}
impl std::error::Error for PipelineError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
PipelineError::Validation(err) => Some(err),
PipelineError::PHash(err) => Some(err),
PipelineError::Kdf(err) => Some(err),
PipelineError::Expand(err) => Some(err),
PipelineError::Cost(err) => Some(err),
PipelineError::Sizer(err) => Some(err),
PipelineError::Stc(err) => Some(err),
PipelineError::Crypto(err) => Some(err),
PipelineError::Output(err) => Some(err),
}
}
}
impl From<ValidationError> for PipelineError {
fn from(err: ValidationError) -> Self {
PipelineError::Validation(err)
}
}
impl From<PHashError> for PipelineError {
fn from(err: PHashError) -> Self {
PipelineError::PHash(err)
}
}
impl From<KdfError> for PipelineError {
fn from(err: KdfError) -> Self {
PipelineError::Kdf(err)
}
}
impl From<ExpandError> for PipelineError {
fn from(err: ExpandError) -> Self {
PipelineError::Expand(err)
}
}
impl From<CostError> for PipelineError {
fn from(err: CostError) -> Self {
PipelineError::Cost(err)
}
}
impl From<SizerError> for PipelineError {
fn from(err: SizerError) -> Self {
PipelineError::Sizer(err)
}
}
impl From<StcError> for PipelineError {
fn from(err: StcError) -> Self {
PipelineError::Stc(err)
}
}
impl From<CryptoError> for PipelineError {
fn from(err: CryptoError) -> Self {
PipelineError::Crypto(err)
}
}
impl From<OutputError> for PipelineError {
fn from(err: OutputError) -> Self {
PipelineError::Output(err)
}
}