use crate::{ merkle::{MerklePath, NodeIndex, RpoDigest}, utils::collections::Vec, }; use core::fmt; use super::smt::SmtLeafError; #[derive(Clone, Debug, PartialEq, Eq)] pub enum MerkleError { ConflictingRoots(Vec), DepthTooSmall(u8), DepthTooBig(u64), DuplicateValuesForIndex(u64), DuplicateValuesForKey(RpoDigest), InvalidIndex { depth: u8, value: u64 }, InvalidDepth { expected: u8, provided: u8 }, InvalidSubtreeDepth { subtree_depth: u8, tree_depth: u8 }, InvalidPath(MerklePath), InvalidNumEntries(usize), NodeNotInSet(NodeIndex), NodeNotInStore(RpoDigest, NodeIndex), NumLeavesNotPowerOfTwo(usize), RootNotInStore(RpoDigest), SmtLeaf(SmtLeafError), } impl fmt::Display for MerkleError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use MerkleError::*; match self { ConflictingRoots(roots) => write!(f, "the merkle paths roots do not match {roots:?}"), DepthTooSmall(depth) => write!(f, "the provided depth {depth} is too small"), DepthTooBig(depth) => write!(f, "the provided depth {depth} is too big"), DuplicateValuesForIndex(key) => write!(f, "multiple values provided for key {key}"), DuplicateValuesForKey(key) => write!(f, "multiple values provided for key {key}"), InvalidIndex { depth, value } => { write!(f, "the index value {value} is not valid for the depth {depth}") } InvalidDepth { expected, provided } => { write!(f, "the provided depth {provided} is not valid for {expected}") } InvalidSubtreeDepth { subtree_depth, tree_depth } => { write!(f, "tried inserting a subtree of depth {subtree_depth} into a tree of depth {tree_depth}") } InvalidPath(_path) => write!(f, "the provided path is not valid"), InvalidNumEntries(max) => write!(f, "number of entries exceeded the maximum: {max}"), NodeNotInSet(index) => write!(f, "the node with index ({index}) is not in the set"), NodeNotInStore(hash, index) => { write!(f, "the node {hash:?} with index ({index}) is not in the store") } NumLeavesNotPowerOfTwo(leaves) => { write!(f, "the leaves count {leaves} is not a power of 2") } RootNotInStore(root) => write!(f, "the root {:?} is not in the store", root), SmtLeaf(smt_leaf_error) => write!(f, "smt leaf error: {smt_leaf_error}"), } } } #[cfg(feature = "std")] impl std::error::Error for MerkleError {} impl From for MerkleError { fn from(value: SmtLeafError) -> Self { Self::SmtLeaf(value) } }