use crate::{
embedded::{messaging::Request, Result},
err,
};
#[derive(Debug, Clone, Copy, Default, PartialEq)]
pub enum Permission {
Guest,
Admin,
#[default]
Owner,
}
impl Permission {
pub fn is_allowed(&self, request: &Request) -> bool {
match request {
Request::Get(_) | Request::Exists(_) | Request::DowngradePermission => true,
Request::Set(_, _)
| Request::Delete(_)
| Request::Increment(_, _)
| Request::Decrement(_, _)
| Request::Search(_) => self == &Permission::Admin || self == &Permission::Owner,
Request::Flush => self == &Permission::Owner,
}
}
pub fn allowed(&self, request: &Request) -> Result<()> {
if self.is_allowed(request) {
Ok(())
} else {
Err(err!(embedded, PermissionFailure))
}
}
pub fn lower(&self) -> Self {
match self {
Permission::Guest => Permission::Guest,
Permission::Admin => Permission::Guest,
Permission::Owner => Permission::Admin,
}
}
}