bit_roles/
lib.rs

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