1use light_poseidon::PoseidonError;
2use thiserror::Error;
3
4use crate::poseidon::PoseidonSyscallError;
5
6#[derive(Debug, Error, PartialEq)]
7pub enum HasherError {
8 #[error("Integer overflow, value too large")]
9 IntegerOverflow,
10 #[error("Poseidon hasher error: {0}")]
11 Poseidon(#[from] PoseidonError),
12 #[error("Poseidon syscall error: {0}")]
13 PoseidonSyscall(#[from] PoseidonSyscallError),
14 #[error("Unknown Solana syscall error: {0}")]
15 UnknownSolanaSyscall(u64),
16 #[error("Allowed input length {0} provided {1}")]
17 InvalidInputLength(usize, usize),
18 #[error("Invalid number of fields")]
19 InvalidNumFields,
20 #[error("Empty input")]
21 EmptyInput,
22 #[error("Borsh serialization failed.")]
23 BorshError,
24 #[error(
25 "Option hash to field size returned [0u8;32], a collision with None for an Option type."
26 )]
27 OptionHashToFieldSizeZero,
28}
29
30impl From<HasherError> for u32 {
33 fn from(e: HasherError) -> u32 {
34 match e {
35 HasherError::IntegerOverflow => 7001,
36 HasherError::Poseidon(_) => 7002,
37 HasherError::PoseidonSyscall(e) => (u64::from(e)).try_into().unwrap_or(7003),
38 HasherError::UnknownSolanaSyscall(e) => e.try_into().unwrap_or(7004),
39 HasherError::InvalidInputLength(_, _) => 7005,
40 HasherError::InvalidNumFields => 7006,
41 HasherError::EmptyInput => 7007,
42 HasherError::BorshError => 7008,
43 HasherError::OptionHashToFieldSizeZero => 7009,
44 }
45 }
46}
47
48#[cfg(feature = "solana")]
49impl From<HasherError> for solana_program_error::ProgramError {
50 fn from(e: HasherError) -> Self {
51 solana_program_error::ProgramError::Custom(e.into())
52 }
53}
54
55#[cfg(feature = "pinocchio")]
56impl From<HasherError> for pinocchio::program_error::ProgramError {
57 fn from(e: HasherError) -> Self {
58 pinocchio::program_error::ProgramError::Custom(e.into())
59 }
60}