#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Hash, PartialEq, Eq, Ord, PartialOrd)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Permissions {
#[cfg_attr(feature = "serde", serde(rename = "permissions"))]
pub vec: Vec<Permission>,
}
impl Permissions {
pub fn new(vec: Vec<Permission>) -> Self {
Self { vec }
}
pub fn get_permission(&self, path: &str, r#mut: bool) -> bool {
let mut best = None;
let mut bestn = 0;
let path: Vec<&str> = path.split('/').collect();
if path.is_empty() {
return false;
}
for i in &self.vec {
let ipath: Vec<&str> = i.path.split('/').collect();
let mut matches = 0;
for path_segment in ipath {
if path_segment
== match path.get(matches) {
Some(m) => *m,
None => break,
}
{
matches += 1;
if bestn < matches {
bestn = matches;
best = Some(i);
if matches == path.len() {
break;
}
}
} else if matches == 0 {
break;
}
}
}
if let Some(best) = best {
return best.auth && (best.r#mut || !r#mut);
}
false
}
}
impl From<Vec<Permission>> for Permissions {
fn from(vec: Vec<Permission>) -> Self {
Self { vec }
}
}
impl Default for Permissions {
fn default() -> Self {
Self { vec: Vec::new() }
}
}
#[derive(Clone, Debug, Hash, PartialEq, Eq, Ord, PartialOrd)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Permission {
pub path: String,
pub auth: bool,
#[cfg_attr(feature = "serde", serde(default))]
pub r#mut: bool,
}
impl Permission {
pub fn new(path: String, auth: bool, r#mut: bool) -> Self {
Self { path, auth, r#mut }
}
}