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}