Derive Macro bit_roles::BitRoleUnchecked

source ·
#[derive(BitRoleUnchecked)]
Expand description

Bit role manager without value checking. Useful when you want to use raw integer role values or you have a complex role enum definition. This requires you to implement the Into<usize> trait for your role enum yourself, and each variant must return a valid role value that is either zero or a power of two. Your role enum must also derive the [Copy] and [Clone] traits.

§Examples

Using raw integer values for role management.

use bit_roles::{
    BitRoleUnchecked,
    RoleValue,
};

#[derive(Debug, BitRoleUnchecked, Copy, Clone)]
enum Permission {
    None = 0,
    SendMessage = 1,
    EditMessage = 2,
}

impl Into<usize> for Permission {
    fn into(self) -> usize {
        self as usize
    }
}

let mut roles = Permission::empty();

// Use a raw integer value for role.
roles
    .try_add_one(RoleValue::Raw(2))
    .expect("invalid role value");

assert!(roles.has_one(Permission::EditMessage));

Using complex role enum definitions.

use bit_roles::{
    BitRoleUnchecked,
    RoleValue,
};

#[derive(Debug, Copy, Clone)]
enum SendMessagePermission {
    ToEveryone,
    ToFriends,
}

#[derive(Debug, BitRoleUnchecked, Copy, Clone)]
enum Permission {
    None,
    SendMessage(SendMessagePermission),
    EditMessage,
}

impl Into<usize> for Permission {
    fn into(self) -> usize {
        match self {
            Permission::None => 0,
            Permission::SendMessage(variant) => match variant {
                SendMessagePermission::ToEveryone => 1,
                SendMessagePermission::ToFriends => 2,
            },
            Permission::EditMessage => 4,
        }
    }
}

let mut roles = Permission::empty();

// Add a complex role to the manager.
roles
    .try_add_one(RoleValue::Role(Permission::SendMessage(
        SendMessagePermission::ToEveryone,
    )))
    .expect("invalid role value");

assert!(roles.has_one(Permission::SendMessage(SendMessagePermission::ToEveryone)));