use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum RiskLevel {
Low,
Medium,
High,
}
impl std::fmt::Display for RiskLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
RiskLevel::Low => write!(f, "low"),
RiskLevel::Medium => write!(f, "medium"),
RiskLevel::High => write!(f, "high"),
}
}
}
pub trait SecurityPolicy: Send + Sync {
fn is_action_allowed(&self, action: &str) -> bool;
fn risk_level(&self, action: &str) -> RiskLevel;
fn requires_confirmation(&self, action: &str) -> bool;
fn record_action(&self) -> bool;
fn is_rate_limited(&self) -> bool;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn risk_level_display() {
assert_eq!(format!("{}", RiskLevel::Low), "low");
assert_eq!(format!("{}", RiskLevel::Medium), "medium");
assert_eq!(format!("{}", RiskLevel::High), "high");
}
#[test]
fn risk_level_serializes() {
let json = serde_json::to_string(&RiskLevel::High).unwrap();
let parsed: RiskLevel = serde_json::from_str(&json).unwrap();
assert_eq!(parsed, RiskLevel::High);
}
}