Skip to main content

ag_agent/model/
permission.rs

1use std::fmt;
2use std::str::FromStr;
3
4/// Supported permission mode values for agent execution workflows.
5#[derive(Clone, Copy, PartialEq, Eq, Debug, Default, Hash)]
6pub enum PermissionMode {
7    #[default]
8    AutoEdit,
9}
10
11impl PermissionMode {
12    /// Returns the wire label used for persistence and display.
13    pub fn label(self) -> &'static str {
14        "auto_edit"
15    }
16
17    /// Returns the user-facing label shown in the UI.
18    pub fn display_label(self) -> &'static str {
19        "Auto Edit"
20    }
21}
22
23impl fmt::Display for PermissionMode {
24    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25        write!(f, "{}", self.label())
26    }
27}
28
29impl FromStr for PermissionMode {
30    type Err = String;
31
32    fn from_str(s: &str) -> Result<Self, Self::Err> {
33        match s {
34            "auto_edit" => Ok(PermissionMode::AutoEdit),
35            _ => Err(format!("Unknown permission mode: {s}")),
36        }
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn test_from_str_accepts_auto_edit() {
46        // Arrange
47        let permission_mode = "auto_edit";
48
49        // Act
50        let parsed_permission_mode = PermissionMode::from_str(permission_mode);
51
52        // Assert
53        assert_eq!(parsed_permission_mode, Ok(PermissionMode::AutoEdit));
54    }
55
56    #[test]
57    fn test_from_str_rejects_removed_permission_modes() {
58        // Arrange
59        let removed_mode = "autonomous";
60
61        // Act
62        let parsed_permission_mode = PermissionMode::from_str(removed_mode);
63
64        // Assert
65        assert_eq!(
66            parsed_permission_mode,
67            Err("Unknown permission mode: autonomous".to_string())
68        );
69    }
70
71    #[test]
72    fn test_default_uses_auto_edit_mode() {
73        // Arrange, Act
74        let permission_mode = PermissionMode::default();
75
76        // Assert
77        assert_eq!(permission_mode, PermissionMode::AutoEdit);
78    }
79
80    #[test]
81    fn test_label_and_display_label_return_persisted_and_user_facing_text() {
82        // Arrange
83        let permission_mode = PermissionMode::AutoEdit;
84
85        // Act
86        let label = permission_mode.label();
87        let display_label = permission_mode.display_label();
88
89        // Assert
90        assert_eq!(label, "auto_edit");
91        assert_eq!(display_label, "Auto Edit");
92    }
93
94    #[test]
95    fn test_display_uses_persisted_label() {
96        // Arrange
97        let permission_mode = PermissionMode::AutoEdit;
98
99        // Act
100        let formatted = permission_mode.to_string();
101
102        // Assert
103        assert_eq!(formatted, "auto_edit");
104    }
105}