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