dharitri_chain_core/types/flags/
dcdt_local_role_flags.rs

1use super::DcdtLocalRole;
2use bitflags::bitflags;
3
4bitflags! {
5    #[derive(PartialEq, Clone, Copy)]
6    pub struct DcdtLocalRoleFlags: u64 {
7        const NONE                  = 0b00000000_00000000;
8        const MINT                  = 0b00000000_00000001;
9        const BURN                  = 0b00000000_00000010;
10        const NFT_CREATE            = 0b00000000_00000100;
11        const NFT_ADD_QUANTITY      = 0b00000000_00001000;
12        const NFT_BURN              = 0b00000000_00010000;
13        const NFT_UPDATE_ATTRIBUTES = 0b00000000_00100000;
14        const NFT_ADD_URI           = 0b00000000_01000000;
15        const NFT_RECREATE          = 0b00000000_10000000;
16        const MODIFY_CREATOR        = 0b00000001_00000000;
17        const MODIFY_ROYALTIES      = 0b00000010_00000000;
18        const SET_NEW_URI           = 0b00000100_00000000;
19        //TODO: check this flag after barnard
20        const TRANSFER              = 0b00001000_00000000;
21    }
22}
23
24impl DcdtLocalRoleFlags {
25    pub fn has_role(&self, role: &DcdtLocalRole) -> bool {
26        *self & role.to_flag() != DcdtLocalRoleFlags::NONE
27    }
28
29    pub fn iter_roles(&self) -> impl Iterator<Item = &DcdtLocalRole> {
30        DcdtLocalRole::iter_all().filter(move |role| self.has_role(role))
31    }
32}
33
34#[cfg(test)]
35pub mod tests {
36    use super::*;
37    use alloc::vec::Vec;
38
39    #[test]
40    fn test_flags_has_role() {
41        let flags = DcdtLocalRoleFlags::MINT;
42        assert!(flags.has_role(&DcdtLocalRole::Mint));
43        let flags = DcdtLocalRoleFlags::MINT | DcdtLocalRoleFlags::BURN;
44        assert!(flags.has_role(&DcdtLocalRole::Mint));
45        let flags = DcdtLocalRoleFlags::NONE;
46        assert!(!flags.has_role(&DcdtLocalRole::Mint));
47        let flags = DcdtLocalRoleFlags::BURN;
48        assert!(!flags.has_role(&DcdtLocalRole::Mint));
49    }
50
51    #[test]
52    fn test_flags_iter_role() {
53        let flags = DcdtLocalRoleFlags::MINT;
54        assert_eq!(
55            flags.iter_roles().collect::<Vec<&DcdtLocalRole>>(),
56            alloc::vec![&DcdtLocalRole::Mint],
57        );
58
59        let flags = DcdtLocalRoleFlags::MINT | DcdtLocalRoleFlags::BURN;
60        assert_eq!(
61            flags.iter_roles().collect::<Vec<&DcdtLocalRole>>(),
62            alloc::vec![&DcdtLocalRole::Mint, &DcdtLocalRole::Burn],
63        );
64
65        let flags = DcdtLocalRoleFlags::NONE;
66        assert_eq!(
67            flags.iter_roles().collect::<Vec<&DcdtLocalRole>>(),
68            Vec::<&DcdtLocalRole>::new(),
69        );
70    }
71}