use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PermissionAction {
Select,
Insert,
Update,
Delete,
}
impl std::fmt::Display for PermissionAction {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PermissionAction::Select => write!(f, "SELECT"),
PermissionAction::Insert => write!(f, "INSERT"),
PermissionAction::Update => write!(f, "UPDATE"),
PermissionAction::Delete => write!(f, "DELETE"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TablePermission {
pub name: String,
pub operations: Vec<PermissionAction>,
}
impl TablePermission {
pub fn allows(&self, action: &PermissionAction) -> bool {
self.operations.contains(action)
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RolePolicy {
pub tables: Vec<TablePermission>,
}
impl RolePolicy {
pub fn allows(&self, table: &str, action: &PermissionAction) -> bool {
for tp in &self.tables {
if (tp.name == "*" || tp.name == table) && tp.allows(action) {
return true;
}
}
false
}
}
#[derive(Debug, Clone, Default)]
pub struct PolicySet {
pub roles: HashMap<String, RolePolicy>,
}