use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum Permission {
Admin(u32),
Write(u32),
Read,
}
impl PartialOrd for Permission {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Permission {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.ordering_value().cmp(&other.ordering_value())
}
}
impl Permission {
fn ordering_value(&self) -> u64 {
match self {
Permission::Read => 0,
Permission::Write(p) => 1 + (u32::MAX as u64) - (*p as u64),
Permission::Admin(p) => 2 + (2 * u32::MAX as u64) - (*p as u64),
}
}
pub fn priority(&self) -> Option<u32> {
match self {
Permission::Read => None,
Permission::Write(priority) => Some(*priority),
Permission::Admin(priority) => Some(*priority),
}
}
pub fn can_write(&self) -> bool {
matches!(self, Permission::Write(_) | Permission::Admin(_))
}
pub fn can_admin(&self) -> bool {
matches!(self, Permission::Admin(_))
}
pub fn clamp_to(&self, max_permission: &Permission) -> Permission {
use std::cmp::min;
min(self.clone(), max_permission.clone())
}
pub fn clamp_to_bounds(&self, bounds: &PermissionBounds) -> Permission {
crate::auth::permission::clamp_permission(self.clone(), bounds)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum KeyStatus {
Active,
Revoked,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct PermissionBounds {
pub max: Permission,
pub min: Option<Permission>,
}
impl Default for PermissionBounds {
fn default() -> Self {
Self {
max: Permission::Read,
min: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Operation {
WriteData,
WriteSettings,
}