agent_core_runtime/permissions/
level.rs1use serde::{Deserialize, Serialize};
7use std::fmt;
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
14#[repr(u8)]
15pub enum PermissionLevel {
16 None = 0,
18 Read = 1,
20 Write = 2,
22 Execute = 3,
24 Admin = 4,
26}
27
28impl PermissionLevel {
29 pub fn as_u8(self) -> u8 {
31 self as u8
32 }
33
34 pub fn from_u8(value: u8) -> Option<Self> {
38 match value {
39 0 => Some(Self::None),
40 1 => Some(Self::Read),
41 2 => Some(Self::Write),
42 3 => Some(Self::Execute),
43 4 => Some(Self::Admin),
44 _ => None,
45 }
46 }
47
48 pub fn satisfies(self, required: Self) -> bool {
63 self >= required
64 }
65
66 pub fn implied_levels(self) -> Vec<Self> {
70 match self {
71 Self::None => vec![Self::None],
72 Self::Read => vec![Self::None, Self::Read],
73 Self::Write => vec![Self::None, Self::Read, Self::Write],
74 Self::Execute => vec![Self::None, Self::Read, Self::Write, Self::Execute],
75 Self::Admin => vec![
76 Self::None,
77 Self::Read,
78 Self::Write,
79 Self::Execute,
80 Self::Admin,
81 ],
82 }
83 }
84
85 pub fn all() -> &'static [Self] {
87 &[
88 Self::None,
89 Self::Read,
90 Self::Write,
91 Self::Execute,
92 Self::Admin,
93 ]
94 }
95}
96
97impl fmt::Display for PermissionLevel {
98 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
99 match self {
100 Self::None => write!(f, "None"),
101 Self::Read => write!(f, "Read"),
102 Self::Write => write!(f, "Write"),
103 Self::Execute => write!(f, "Execute"),
104 Self::Admin => write!(f, "Admin"),
105 }
106 }
107}
108
109impl Default for PermissionLevel {
110 fn default() -> Self {
111 Self::None
112 }
113}
114
115#[cfg(test)]
116mod tests {
117 use super::*;
118
119 #[test]
120 fn test_level_ordering() {
121 assert!(PermissionLevel::Admin > PermissionLevel::Execute);
122 assert!(PermissionLevel::Execute > PermissionLevel::Write);
123 assert!(PermissionLevel::Write > PermissionLevel::Read);
124 assert!(PermissionLevel::Read > PermissionLevel::None);
125 }
126
127 #[test]
128 fn test_satisfies() {
129 assert!(PermissionLevel::Read.satisfies(PermissionLevel::Read));
131 assert!(PermissionLevel::Write.satisfies(PermissionLevel::Write));
132
133 assert!(PermissionLevel::Write.satisfies(PermissionLevel::Read));
135 assert!(PermissionLevel::Execute.satisfies(PermissionLevel::Write));
136 assert!(PermissionLevel::Admin.satisfies(PermissionLevel::Execute));
137
138 assert!(PermissionLevel::Admin.satisfies(PermissionLevel::None));
140 assert!(PermissionLevel::Admin.satisfies(PermissionLevel::Read));
141 assert!(PermissionLevel::Admin.satisfies(PermissionLevel::Write));
142 assert!(PermissionLevel::Admin.satisfies(PermissionLevel::Execute));
143 assert!(PermissionLevel::Admin.satisfies(PermissionLevel::Admin));
144
145 assert!(!PermissionLevel::Read.satisfies(PermissionLevel::Write));
147 assert!(!PermissionLevel::Write.satisfies(PermissionLevel::Execute));
148 assert!(!PermissionLevel::Execute.satisfies(PermissionLevel::Admin));
149 assert!(!PermissionLevel::None.satisfies(PermissionLevel::Read));
150 }
151
152 #[test]
153 fn test_from_u8() {
154 assert_eq!(PermissionLevel::from_u8(0), Some(PermissionLevel::None));
155 assert_eq!(PermissionLevel::from_u8(1), Some(PermissionLevel::Read));
156 assert_eq!(PermissionLevel::from_u8(2), Some(PermissionLevel::Write));
157 assert_eq!(PermissionLevel::from_u8(3), Some(PermissionLevel::Execute));
158 assert_eq!(PermissionLevel::from_u8(4), Some(PermissionLevel::Admin));
159 assert_eq!(PermissionLevel::from_u8(5), None);
160 }
161
162 #[test]
163 fn test_implied_levels() {
164 assert_eq!(
165 PermissionLevel::Write.implied_levels(),
166 vec![
167 PermissionLevel::None,
168 PermissionLevel::Read,
169 PermissionLevel::Write
170 ]
171 );
172 }
173
174 #[test]
175 fn test_display() {
176 assert_eq!(format!("{}", PermissionLevel::Read), "Read");
177 assert_eq!(format!("{}", PermissionLevel::Admin), "Admin");
178 }
179
180 #[test]
181 fn test_serialization() {
182 let level = PermissionLevel::Write;
183 let json = serde_json::to_string(&level).unwrap();
184 assert_eq!(json, "\"Write\"");
185
186 let deserialized: PermissionLevel = serde_json::from_str(&json).unwrap();
187 assert_eq!(deserialized, level);
188 }
189}