ag_agent/model/
permission.rs1use std::fmt;
2use std::str::FromStr;
3
4#[derive(Clone, Copy, PartialEq, Eq, Debug, Default, Hash)]
6pub enum PermissionMode {
7 #[default]
9 AutoEdit,
10 ReadOnly,
13}
14
15impl PermissionMode {
16 pub fn label(self) -> &'static str {
18 match self {
19 Self::AutoEdit => "auto_edit",
20 Self::ReadOnly => "read_only",
21 }
22 }
23
24 pub fn display_label(self) -> &'static str {
26 match self {
27 Self::AutoEdit => "Auto Edit",
28 Self::ReadOnly => "Read Only",
29 }
30 }
31
32 pub fn is_read_only(self) -> bool {
34 self == Self::ReadOnly
35 }
36}
37
38impl fmt::Display for PermissionMode {
39 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
40 write!(f, "{}", self.label())
41 }
42}
43
44impl FromStr for PermissionMode {
45 type Err = String;
46
47 fn from_str(s: &str) -> Result<Self, Self::Err> {
48 match s {
49 "auto_edit" => Ok(PermissionMode::AutoEdit),
50 "read_only" => Ok(PermissionMode::ReadOnly),
51 _ => Err(format!("Unknown permission mode: {s}")),
52 }
53 }
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[test]
61 fn test_from_str_accepts_supported_modes() {
62 let permission_modes = ["auto_edit", "read_only"];
64
65 let parsed_permission_modes = permission_modes.map(PermissionMode::from_str);
67
68 assert_eq!(
70 parsed_permission_modes,
71 [Ok(PermissionMode::AutoEdit), Ok(PermissionMode::ReadOnly)]
72 );
73 }
74
75 #[test]
76 fn test_from_str_rejects_removed_permission_modes() {
77 let removed_mode = "autonomous";
79
80 let parsed_permission_mode = PermissionMode::from_str(removed_mode);
82
83 assert_eq!(
85 parsed_permission_mode,
86 Err("Unknown permission mode: autonomous".to_string())
87 );
88 }
89
90 #[test]
91 fn test_default_uses_auto_edit_mode() {
92 let permission_mode = PermissionMode::default();
94
95 assert_eq!(permission_mode, PermissionMode::AutoEdit);
97 }
98
99 #[test]
100 fn test_label_and_display_label_return_persisted_and_user_facing_text() {
101 let permission_modes = [PermissionMode::AutoEdit, PermissionMode::ReadOnly];
103
104 let labels = permission_modes.map(PermissionMode::label);
106 let display_labels = permission_modes.map(PermissionMode::display_label);
107 let read_only = permission_modes.map(PermissionMode::is_read_only);
108
109 assert_eq!(labels, ["auto_edit", "read_only"]);
111 assert_eq!(display_labels, ["Auto Edit", "Read Only"]);
112 assert_eq!(read_only, [false, true]);
113 }
114
115 #[test]
116 fn test_display_uses_persisted_label() {
117 let permission_mode = PermissionMode::AutoEdit;
119
120 let formatted = permission_mode.to_string();
122
123 assert_eq!(formatted, "auto_edit");
125 }
126}