use core::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum Error {
TreeFull {
capacity: usize,
attempted_index: usize,
},
InvalidProof,
UnknownRoot,
InvalidLength {
expected: usize,
actual: usize,
},
ParseError(String),
FieldOverflow,
InvalidTreeConfig(String),
LeafIndexOutOfBounds {
index: u32,
tree_size: u32,
},
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::TreeFull {
capacity,
attempted_index,
} => {
write!(
f,
"Merkle tree is full: capacity={}, attempted index={}",
capacity, attempted_index
)
}
Error::InvalidProof => write!(f, "Invalid Merkle proof"),
Error::UnknownRoot => write!(f, "Root not found in history"),
Error::InvalidLength { expected, actual } => {
write!(
f,
"Invalid length: expected {} bytes, got {}",
expected, actual
)
}
Error::ParseError(msg) => write!(f, "Parse error: {}", msg),
Error::FieldOverflow => write!(f, "Arithmetic overflow in field operation"),
Error::InvalidTreeConfig(msg) => write!(f, "Invalid tree configuration: {}", msg),
Error::LeafIndexOutOfBounds { index, tree_size } => {
write!(
f,
"Leaf index {} out of bounds (tree has {} leaves)",
index, tree_size
)
}
}
}
}
#[cfg(feature = "std")]
impl std::error::Error for Error {}
pub type Result<T> = core::result::Result<T, Error>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_display() {
let err = Error::TreeFull {
capacity: 100,
attempted_index: 100,
};
assert!(err.to_string().contains("100"));
let err = Error::ParseError("invalid input".to_string());
assert!(err.to_string().contains("invalid input"));
}
#[test]
fn test_error_equality() {
let err1 = Error::InvalidProof;
let err2 = Error::InvalidProof;
assert_eq!(err1, err2);
let err3 = Error::UnknownRoot;
assert_ne!(err1, err3);
}
}