Cleanup of permissions.rs

This commit is contained in:
Nadja Reitzenstein 2021-10-20 14:11:56 +02:00
parent efe2da87d3
commit a7754f057b

View File

@ -175,11 +175,13 @@ pub struct PermissionBuf {
inner: String, inner: String,
} }
impl PermissionBuf { impl PermissionBuf {
#[inline(always)]
/// Allocate an empty `PermissionBuf` /// Allocate an empty `PermissionBuf`
pub fn new() -> Self { pub fn new() -> Self {
PermissionBuf { inner: String::new() } PermissionBuf { inner: String::new() }
} }
#[inline(always)]
/// Allocate a `PermissionBuf` with the given capacity given to the internal [`String`] /// Allocate a `PermissionBuf` with the given capacity given to the internal [`String`]
pub fn with_capacity(cap: usize) -> Self { pub fn with_capacity(cap: usize) -> Self {
PermissionBuf { inner: String::with_capacity(cap) } PermissionBuf { inner: String::with_capacity(cap) }
@ -203,18 +205,22 @@ impl PermissionBuf {
self.inner.push_str(perm.as_str()) self.inner.push_str(perm.as_str())
} }
#[inline(always)]
pub const fn from_string_unchecked(inner: String) -> Self { pub const fn from_string_unchecked(inner: String) -> Self {
Self { inner } Self { inner }
} }
#[inline]
pub fn from_perm(perm: &Permission) -> Self { pub fn from_perm(perm: &Permission) -> Self {
Self { inner: perm.inner.to_string() } Self { inner: perm.as_str().to_string() }
} }
#[inline(always)]
pub fn into_string(self) -> String { pub fn into_string(self) -> String {
self.inner self.inner
} }
#[inline(always)]
pub fn is_empty(&self) -> bool { pub fn is_empty(&self) -> bool {
self.inner.is_empty() self.inner.is_empty()
} }
@ -258,21 +264,24 @@ impl fmt::Display for PermissionBuf {
/// This means that ```(bffh.perm) > (bffh.perm.sub) == true``` /// This means that ```(bffh.perm) > (bffh.perm.sub) == true```
/// but ```(bffh.perm) > (unrelated.but.more.specific.perm) == false```. /// but ```(bffh.perm) > (unrelated.but.more.specific.perm) == false```.
/// This allows to check if PermRule a grants Perm b by checking `a > b`. /// This allows to check if PermRule a grants Perm b by checking `a > b`.
pub struct Permission { pub struct Permission(str);
inner: str
}
impl Permission { impl Permission {
#[inline(always)]
// We can't make this `const` just yet because `str` is always a fat pointer meaning we can't
// just const cast it, and `CoerceUnsized` and friends are currently unstable.
pub fn new<S: AsRef<str> + ?Sized>(s: &S) -> &Permission { pub fn new<S: AsRef<str> + ?Sized>(s: &S) -> &Permission {
// Safe because s is a valid reference // Safe because s is a valid reference
unsafe { &*(s.as_ref() as *const str as *const Permission) } unsafe { &*(s.as_ref() as *const str as *const Permission) }
} }
#[inline(always)]
pub fn as_str(&self) -> &str { pub fn as_str(&self) -> &str {
&self.inner &self.0
} }
#[inline(always)]
pub fn iter(&self) -> std::str::Split<char> { pub fn iter(&self) -> std::str::Split<char> {
self.inner.split('.') self.0.split('.')
} }
} }