Skip to main content

Mountain/IPC/Permission/Role/ManageRole/
Permission.rs

1#![allow(non_snake_case)]
2
3//! `Permission::Struct` - RBAC permission descriptor.
4//! `category.action` name shape (validated by `Validate`),
5//! human description, category bucket, and an `IsSensitive`
6//! flag that drives elevated audit logging in the
7//! `LogEvent` module.
8
9use serde::{Deserialize, Serialize};
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct Struct {
13	pub Name:String,
14
15	pub Description:String,
16
17	pub Category:String,
18
19	pub IsSensitive:bool,
20}
21
22impl Struct {
23	pub fn New(Name:String, Description:String, Category:String) -> Self {
24		Self { Name, Description, Category, IsSensitive:false }
25	}
26
27	pub fn NewSensitive(Name:String, Description:String, Category:String) -> Self {
28		Self { Name, Description, Category, IsSensitive:true }
29	}
30
31	pub fn SetSensitive(mut self) -> Self {
32		self.IsSensitive = true;
33
34		self
35	}
36
37	pub fn GetAction(&self) -> String { self.Name.rsplit('.').next().unwrap_or("unknown").to_string() }
38
39	pub fn GetCategory(&self) -> String {
40		if let Some(pos) = self.Name.rfind('.') {
41			self.Name[..pos].to_string()
42		} else {
43			"unknown".to_string()
44		}
45	}
46
47	pub fn Validate(&self) -> Result<(), String> {
48		if self.Name.is_empty() {
49			return Err("Permission name cannot be empty".to_string());
50		}
51
52		if self.Name.contains(|c:char| c.is_whitespace()) {
53			return Err("Permission name cannot contain whitespace".to_string());
54		}
55
56		if !self.Name.contains('.') {
57			return Err("Permission name must contain a dot separating category and action".to_string());
58		}
59
60		if self.Description.is_empty() {
61			return Err("Permission description cannot be empty".to_string());
62		}
63
64		if self.Category.is_empty() {
65			return Err("Permission category cannot be empty".to_string());
66		}
67
68		Ok(())
69	}
70}