use std::string::String;
use std::vec::Vec;
use crate::rbac::permission::Permission;
#[derive(Debug, Clone)]
pub struct Role {
pub name: String,
pub permissions: Vec<(Permission, Option<String>, Option<String>)>, }
impl Role {
pub fn new(name: String) -> Self {
Self {
name,
permissions: Vec::new(),
}
}
pub fn add_permission(
&mut self,
permission: Permission,
table_name: Option<String>,
column_name: Option<String>,
) {
self.permissions.push((permission, table_name, column_name));
}
pub fn remove_permission(
&mut self,
permission: &Permission,
table_name: &Option<String>,
column_name: &Option<String>,
) {
self.permissions
.retain(|(p, t, c)| p != permission || t != table_name || c != column_name);
}
pub fn has_permission(
&self,
permission: &Permission,
table_name: &Option<String>,
column_name: &Option<String>,
) -> bool {
self.permissions.iter().any(|(p, t, c)| {
p == permission
&& (t.is_none() || table_name.is_none() || t == table_name)
&& (c.is_none() || column_name.is_none() || c == column_name)
})
}
}