use super::*;
#[derive(Debug)]
#[cfg_attr(feature = "std", derive(thiserror::Error))]
pub enum Error<F: BackedFile, M: BackedManifest> {
#[cfg_attr(feature = "std", error("manifest has bad magic text"))]
BadMagicText,
#[cfg_attr(feature = "std", error("cannot open manifest because the external magic doesn't match. expected {expected}, found {found}"))]
BadExternalMagic {
expected: u16,
found: u16,
},
#[cfg_attr(
feature = "std",
error(
"cannot open manifest because the magic doesn't match. expected {expected}, found {found}"
)
)]
BadMagic {
expected: u16,
found: u16,
},
#[cfg_attr(feature = "std", error("entry checksum mismatch"))]
ChecksumMismatch,
#[cfg_attr(feature = "std", error("entry data len {len} is greater than the remaining file size {remaining}, manifest file might be corrupted"))]
EntryTooLarge {
len: u32,
remaining: u32,
},
#[cfg_attr(feature = "std", error(transparent))]
Data(<M::Data as Data>::Error),
#[cfg_attr(feature = "std", error(transparent))]
Manifest(M::Error),
#[cfg_attr(feature = "std", error(transparent))]
IO(F::Error),
}
#[cfg(not(feature = "std"))]
impl<F: BackedFile, M: BackedManifest> core::fmt::Display for Error<F, M> {
#[inline]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::BadExternalMagic { expected, found } => write!(
f,
"cannot open manifest because the external magic doesn't match. expected {}, found {}",
expected, found
),
Self::BadMagic { expected, found } => write!(
f,
"cannot open manifest because the magic doesn't match. expected {}, found {}",
expected, found
),
Self::BadMagicText => write!(f, "manifest has bad magic text"),
Self::ChecksumMismatch => write!(f, "entry checksum mismatch"),
Self::EntryTooLarge { len, remaining } => write!(
f,
"entry data len {} is greater than the remaining file size {}, manifest file might be corrupted",
len, remaining
),
Self::Data(err) => err.fmt(f),
Self::Manifest(err) => err.fmt(f),
Self::IO(err) => err.fmt(f),
}
}
}
impl<F: BackedFile, M: BackedManifest> Error<F, M> {
#[inline]
pub const fn io(err: F::Error) -> Self {
Self::IO(err)
}
#[inline]
pub const fn data(err: <M::Data as Data>::Error) -> Self {
Self::Data(err)
}
#[inline]
pub const fn manifest(err: M::Error) -> Self {
Self::Manifest(err)
}
#[inline]
pub(crate) const fn entry_corrupted(len: u32, remaining: u32) -> Self {
Self::EntryTooLarge { len, remaining }
}
}