sealevel_tools/
error.rs

1//! Error types for this crate.
2
3use crate::{log::sol_log, program_error::ProgramError};
4
5#[derive(Debug)]
6pub enum SealevelToolsError<'a> {
7    PassThrough(ProgramError),
8
9    /// Error relating to the [`account_info` module]. Custom program error code
10    /// reflected by [ACCOUNT_INFO].
11    ///
12    /// [`account_info` module]: crate::account_info
13    /// [ACCOUNT_INFO]: Self::ACCOUNT_INFO
14    AccountInfo(&'a [&'a str]),
15
16    /// Error relating to [`cpi` module]. Custom program error code reflected by
17    /// [CPI].
18    ///
19    /// [`cpi` module]: crate::cpi
20    /// [CPI]: Self::CPI
21    Cpi(&'a [&'a str]),
22}
23
24impl<'a> SealevelToolsError<'a> {
25    pub const ACCOUNT_INFO: u32 = u32::from_be_bytes(
26        crate::discriminator::Discriminator::Sha2(b"sealevel_tools::account_info").to_bytes(),
27    );
28    pub const CPI: u32 = u32::from_be_bytes(
29        crate::discriminator::Discriminator::Sha2(b"sealevel_tools::cpi").to_bytes(),
30    );
31}
32
33impl<'a> From<SealevelToolsError<'a>> for ProgramError {
34    fn from(e: SealevelToolsError) -> ProgramError {
35        let (msgs, code) = match e {
36            SealevelToolsError::PassThrough(err) => return err,
37            SealevelToolsError::AccountInfo(err) => {
38                sol_log("Custom error: AccountInfo");
39                (err, SealevelToolsError::ACCOUNT_INFO)
40            }
41            SealevelToolsError::Cpi(err) => {
42                sol_log("Custom error: CPI");
43                (err, SealevelToolsError::CPI)
44            }
45        };
46
47        msgs.iter().for_each(|err| sol_log(err));
48
49        ProgramError::Custom(code)
50    }
51}
52
53impl<'a> From<ProgramError> for SealevelToolsError<'a> {
54    fn from(e: ProgramError) -> SealevelToolsError<'a> {
55        SealevelToolsError::PassThrough(e)
56    }
57}