use super::AccessHierarchy;
use tracing::debug;
#[derive(Debug, Clone)]
pub struct AccessScope<Role> {
pub role: Role,
pub allow_supervisor_access: bool,
}
impl<Role> AccessScope<Role>
where
Role: AccessHierarchy + Eq + std::fmt::Display,
{
pub fn new(role: Role) -> Self {
Self {
role,
allow_supervisor_access: false,
}
}
pub fn grants_role(&self, role: &Role) -> bool {
self.role.eq(role)
}
pub fn grants_supervisor(&self, role: &Role) -> bool {
if !self.allow_supervisor_access {
debug!(
"Scope for role {} does not allow supervisor access.",
self.role
);
return false;
}
if role >= &self.role {
debug!(
"Role {role} is same or supervisor of required role {} – access granted.",
self.role
);
true
} else {
debug!(
"Role {role} is NOT a supervisor of required role {} – access denied.",
self.role
);
false
}
}
pub fn allow_supervisor(mut self) -> Self {
self.allow_supervisor_access = true;
self
}
}