diff --git a/src/merkle/error.rs b/src/merkle/error.rs new file mode 100644 index 0000000..5012b75 --- /dev/null +++ b/src/merkle/error.rs @@ -0,0 +1,54 @@ +use crate::{ + merkle::{MerklePath, NodeIndex, RpoDigest}, + utils::collections::Vec, +}; +use core::fmt; + +#[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 }, + InvalidPath(MerklePath), + InvalidNumEntries(usize, usize), + NodeNotInSet(NodeIndex), + NodeNotInStore(RpoDigest, NodeIndex), + NumLeavesNotPowerOfTwo(usize), + RootNotInStore(RpoDigest), +} + +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}" + ), + InvalidPath(_path) => write!(f, "the provided path is not valid"), + InvalidNumEntries(max, provided) => write!(f, "the provided number of entries is {provided}, but the maximum for the given depth is {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), + } + } +} + +#[cfg(feature = "std")] +impl std::error::Error for MerkleError {} diff --git a/src/merkle/mod.rs b/src/merkle/mod.rs index 1e687e7..4d9bbeb 100644 --- a/src/merkle/mod.rs +++ b/src/merkle/mod.rs @@ -3,7 +3,6 @@ use super::{ utils::collections::{vec, BTreeMap, BTreeSet, KvMap, RecordingMap, TryApplyDiff, Vec}, Felt, StarkField, Word, WORD_SIZE, ZERO, }; -use core::fmt; // REEXPORTS // ================================================================================================ @@ -41,57 +40,8 @@ pub use node::InnerNodeInfo; mod partial_mt; pub use partial_mt::PartialMerkleTree; -// ERRORS -// ================================================================================================ - -#[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 }, - InvalidPath(MerklePath), - InvalidNumEntries(usize, usize), - NodeNotInSet(NodeIndex), - NodeNotInStore(RpoDigest, NodeIndex), - NumLeavesNotPowerOfTwo(usize), - RootNotInStore(RpoDigest), -} - -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}" - ), - InvalidPath(_path) => write!(f, "the provided path is not valid"), - InvalidNumEntries(max, provided) => write!(f, "the provided number of entries is {provided}, but the maximum for the given depth is {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), - } - } -} - -#[cfg(feature = "std")] -impl std::error::Error for MerkleError {} +mod error; +pub use error::MerkleError; // HELPER FUNCTIONS // ================================================================================================