1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//! # Bit Roles
//!
//! [](https://crates.io/crates/bit_roles)
//! [](https://docs.rs/bit_roles)
//!
//! This crate enables you to implement granular role and permission management
//! based on bit flags.
//!
//! You can derive the [BitRole] trait for your role enum. It ensures
//! compile-time validation for enum discriminants. Ensure you specify a
//! discriminant for every enum variant; it must be either zero or a power of
//! two. Also, remember to derive the [Copy] and [Clone] traits for your enum.
//!
//! If you need a manager without compile-time checks, it's also exported as
//! [BitRoleUnchecked] trait. This is useful if you want to use raw integer
//! values for roles or have a complex role enum definition. You will need to
//! implement the `Into<usize>` trait for your role enum, along with deriving
//! the [Copy] and [Clone] traits for it.
//!
//! # Examples
//!
//! ```
//! use bit_roles::BitRole;
//!
//! #[derive(Debug)]
//! struct User {
//! permissions: usize,
//! }
//!
//! #[derive(Debug, BitRole, Copy, Clone)]
//! enum Permission {
//! None = 0,
//! SendMessage = 1,
//! EditMessage = 2,
//! }
//!
//! let mut permissions = Permission::empty();
//! permissions.add_one(Permission::SendMessage);
//!
//! let user = User {
//! permissions: permissions.get_value(),
//! };
//!
//! // Checking if the user can edit messages.
//! let manager = Permission::from_value(user.permissions);
//! let can_edit_messages = manager.has_one(Permission::EditMessage); // `false`
//! ```
pub use ;
pub use *;
pub use RoleError;
pub use RoleValue;
pub use *;
pub use is_valid_role;
/// The role variant trait. All role enums must implement this trait.