use std::collections::BTreeSet;
use soaprs_core::SoapResult;
use crate::{AuthorizationName, PrincipalId};
pub trait Principal: Send + Sync {
fn principal_id(&self) -> &PrincipalId;
fn has_role(&self, role: &AuthorizationName) -> bool;
fn has_permission(&self, permission: &AuthorizationName) -> bool;
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct StandardPrincipal {
id: PrincipalId,
roles: BTreeSet<AuthorizationName>,
permissions: BTreeSet<AuthorizationName>,
}
impl StandardPrincipal {
pub fn new(id: impl Into<String>) -> SoapResult<Self> {
Ok(Self {
id: PrincipalId::new(id)?,
roles: BTreeSet::new(),
permissions: BTreeSet::new(),
})
}
pub fn role(mut self, role: impl Into<String>) -> SoapResult<Self> {
self.roles.insert(AuthorizationName::new(role)?);
Ok(self)
}
pub fn permission(mut self, permission: impl Into<String>) -> SoapResult<Self> {
self.permissions.insert(AuthorizationName::new(permission)?);
Ok(self)
}
pub fn roles(&self) -> &BTreeSet<AuthorizationName> {
&self.roles
}
pub fn permissions(&self) -> &BTreeSet<AuthorizationName> {
&self.permissions
}
}
impl Principal for StandardPrincipal {
fn principal_id(&self) -> &PrincipalId {
&self.id
}
fn has_role(&self, role: &AuthorizationName) -> bool {
self.roles.contains(role)
}
fn has_permission(&self, permission: &AuthorizationName) -> bool {
self.permissions.contains(permission)
}
}