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)));