use crate::HeaderFamily;
use core::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Error {
WrongLength {
family: HeaderFamily,
expected: usize,
actual: usize,
},
VersionBit31Set,
VersionBit31Clear,
ReservedFlags(u8),
InvalidHex,
CompactNegative(u32),
CompactOverflow(u32),
BitsNotPowLimit {
bits: u32,
expected: u32,
},
TargetNotMet,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::WrongLength {
family,
expected,
actual,
} => write!(f, "a {family} header is {expected} bytes, got {actual}"),
Error::VersionBit31Set => f.write_str("stock header version has bit 31 set"),
Error::VersionBit31Clear => f.write_str("v2 header version has bit 31 clear"),
Error::ReservedFlags(flags) => {
write!(
f,
"v2 header flags {flags:#04x} set a reserved bit (6 or 7)"
)
}
Error::InvalidHex => f.write_str("expected 64 hex characters"),
Error::CompactNegative(bits) => write!(f, "compact target {bits:#010x} is negative"),
Error::CompactOverflow(bits) => {
write!(f, "compact target {bits:#010x} overflows 256 bits")
}
Error::BitsNotPowLimit { bits, expected } => write!(
f,
"header bits {bits:#010x} are not the chain's powLimit {expected:#010x}"
),
Error::TargetNotMet => f.write_str("block hash does not meet the target"),
}
}
}
#[cfg(feature = "std")]
impl std::error::Error for Error {}