#![cfg_attr(not(test), no_std)]
#![doc = include_str!("../README.md")]
bitflags::bitflags! {
#[derive(Default, Debug, Clone, Copy)]
pub struct Cap: u32 {
const READ = 1 << 0;
const WRITE = 1 << 1;
const EXECUTE = 1 << 2;
}
}
pub struct WithCap<T> {
inner: T,
cap: Cap,
}
impl<T> WithCap<T> {
pub fn new(inner: T, cap: Cap) -> Self {
Self { inner, cap }
}
pub const fn cap(&self) -> Cap {
self.cap
}
pub const fn can_access(&self, cap: Cap) -> bool {
self.cap.contains(cap)
}
pub unsafe fn access_unchecked(&self) -> &T {
&self.inner
}
pub const fn access(&self, cap: Cap) -> Option<&T> {
if self.can_access(cap) {
Some(&self.inner)
} else {
None
}
}
pub fn access_or_err<E>(&self, cap: Cap, err: E) -> Result<&T, E> {
if self.can_access(cap) {
Ok(&self.inner)
} else {
Err(err)
}
}
}