dharitri_chain_core/types/flags/
dcdt_local_role_flags.rs

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