light_indexed_merkle_tree/
errors.rs

1use light_bounded_vec::BoundedVecError;
2use light_concurrent_merkle_tree::{
3    errors::ConcurrentMerkleTreeError, light_hasher::errors::HasherError,
4};
5use light_utils::UtilsError;
6use thiserror::Error;
7
8#[derive(Debug, Error)]
9pub enum IndexedMerkleTreeError {
10    #[error("Integer overflow")]
11    IntegerOverflow,
12    #[error("Invalid index, it exceeds the number of elements.")]
13    IndexHigherThanMax,
14    #[error("Could not find the low element.")]
15    LowElementNotFound,
16    #[error("Low element is greater or equal to the provided new element.")]
17    LowElementGreaterOrEqualToNewElement,
18    #[error("The provided new element is greater or equal to the next element.")]
19    NewElementGreaterOrEqualToNextElement,
20    #[error("The element already exists, but was expected to be absent.")]
21    ElementAlreadyExists,
22    #[error("The element does not exist, but was expected to be present.")]
23    ElementDoesNotExist,
24    #[error("Invalid changelog buffer size, expected {0}, got {1}")]
25    ChangelogBufferSize(usize, usize),
26    #[error("Hasher error: {0}")]
27    Hasher(#[from] HasherError),
28    #[error("Concurrent Merkle tree error: {0}")]
29    ConcurrentMerkleTree(#[from] ConcurrentMerkleTreeError),
30    #[error("Utils error {0}")]
31    Utils(#[from] UtilsError),
32    #[error("Bounded vector error: {0}")]
33    BoundedVec(#[from] BoundedVecError),
34    #[error("Indexed array is full, cannot append more elements")]
35    ArrayFull,
36}
37
38// NOTE(vadorovsky): Unfortunately, we need to do it by hand. `num_derive::ToPrimitive`
39// doesn't support data-carrying enums.
40#[cfg(feature = "solana")]
41impl From<IndexedMerkleTreeError> for u32 {
42    fn from(e: IndexedMerkleTreeError) -> u32 {
43        match e {
44            IndexedMerkleTreeError::IntegerOverflow => 11001,
45            IndexedMerkleTreeError::IndexHigherThanMax => 11002,
46            IndexedMerkleTreeError::LowElementNotFound => 11003,
47            IndexedMerkleTreeError::LowElementGreaterOrEqualToNewElement => 11004,
48            IndexedMerkleTreeError::NewElementGreaterOrEqualToNextElement => 11005,
49            IndexedMerkleTreeError::ElementAlreadyExists => 11006,
50            IndexedMerkleTreeError::ElementDoesNotExist => 11007,
51            IndexedMerkleTreeError::ChangelogBufferSize(_, _) => 11008,
52            IndexedMerkleTreeError::ArrayFull => 11009,
53            IndexedMerkleTreeError::Hasher(e) => e.into(),
54            IndexedMerkleTreeError::ConcurrentMerkleTree(e) => e.into(),
55            IndexedMerkleTreeError::Utils(e) => e.into(),
56            IndexedMerkleTreeError::BoundedVec(e) => e.into(),
57        }
58    }
59}
60
61#[cfg(feature = "solana")]
62impl From<IndexedMerkleTreeError> for solana_program::program_error::ProgramError {
63    fn from(e: IndexedMerkleTreeError) -> Self {
64        solana_program::program_error::ProgramError::Custom(e.into())
65    }
66}