tape_api/
loaders.rs

1use steel::*;
2
3use crate::consts::*;
4use crate::state::{Archive, Epoch, Treasury};
5
6pub trait AccountInfoLoader {
7    fn is_archive(&self) -> Result<&Self, ProgramError>;
8    fn is_epoch(&self) -> Result<&Self, ProgramError>;
9    fn is_treasury(&self) -> Result<&Self, ProgramError>;
10    fn is_treasury_ata(&self) -> Result<&Self, ProgramError>;
11    fn is_spool(&self) -> Result<&Self, ProgramError>;
12}
13
14impl AccountInfoLoader for AccountInfo<'_> {
15    fn is_archive(&self) -> Result<&Self, ProgramError> {
16        self.has_address(&ARCHIVE_ADDRESS)?
17            .is_type::<Archive>(&crate::ID)
18    }
19
20    fn is_epoch(&self) -> Result<&Self, ProgramError> {
21        self.has_address(&EPOCH_ADDRESS)?
22            .is_type::<Epoch>(&crate::ID)
23    }
24
25    fn is_treasury(&self) -> Result<&Self, ProgramError> {
26        self.has_address(&TREASURY_ADDRESS)?
27            .is_type::<Treasury>(&crate::ID)
28    }
29
30    fn is_treasury_ata(&self) -> Result<&Self, ProgramError> {
31        self.has_address(&TREASURY_ATA)
32    }
33
34    fn is_spool(&self) -> Result<&Self, ProgramError> {
35        if !SPOOL_ADDRESSES.contains(self.key) {
36            return Err(ProgramError::InvalidSeeds);
37        }
38        Ok(self)
39    }
40}