intent_engine/
priority.rs

1use crate::error::{IntentError, Result};
2use std::str::FromStr;
3
4/// Priority levels mapped to integers for storage and sorting
5/// Lower number = Higher priority
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum PriorityLevel {
8    Critical = 1,
9    High = 2,
10    Medium = 3,
11    Low = 4,
12}
13
14impl FromStr for PriorityLevel {
15    type Err = IntentError;
16
17    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
18        match s.to_lowercase().as_str() {
19            "critical" => Ok(Self::Critical),
20            "high" => Ok(Self::High),
21            "medium" => Ok(Self::Medium),
22            "low" => Ok(Self::Low),
23            _ => Err(IntentError::InvalidInput(format!(
24                "Invalid priority '{}'. Valid values: critical, high, medium, low",
25                s
26            ))),
27        }
28    }
29}
30
31impl PriorityLevel {
32    /// Parse a priority string into integer value
33    pub fn parse_to_int(s: &str) -> Result<i32> {
34        let level: PriorityLevel = s.parse()?;
35        Ok(level as i32)
36    }
37
38    /// Convert integer priority back to string
39    pub fn to_str(priority: i32) -> &'static str {
40        match priority {
41            1 => "critical",
42            2 => "high",
43            3 => "medium",
44            4 => "low",
45            _ => "unknown",
46        }
47    }
48
49    /// Parse optional priority string
50    pub fn parse_optional(s: Option<&str>) -> Result<Option<i32>> {
51        match s {
52            Some(priority_str) => Ok(Some(Self::parse_to_int(priority_str)?)),
53            None => Ok(None),
54        }
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61
62    #[test]
63    fn test_priority_from_str() {
64        assert_eq!(PriorityLevel::parse_to_int("critical").unwrap(), 1);
65        assert_eq!(PriorityLevel::parse_to_int("high").unwrap(), 2);
66        assert_eq!(PriorityLevel::parse_to_int("medium").unwrap(), 3);
67        assert_eq!(PriorityLevel::parse_to_int("low").unwrap(), 4);
68        assert_eq!(PriorityLevel::parse_to_int("CRITICAL").unwrap(), 1); // case insensitive
69    }
70
71    #[test]
72    fn test_priority_from_str_invalid() {
73        assert!(PriorityLevel::parse_to_int("invalid").is_err());
74        assert!(PriorityLevel::parse_to_int("").is_err());
75    }
76
77    #[test]
78    fn test_standard_fromstr_trait() {
79        use std::str::FromStr;
80        assert_eq!(
81            PriorityLevel::from_str("critical").unwrap(),
82            PriorityLevel::Critical
83        );
84        assert_eq!(
85            PriorityLevel::from_str("high").unwrap(),
86            PriorityLevel::High
87        );
88        assert_eq!(
89            PriorityLevel::from_str("medium").unwrap(),
90            PriorityLevel::Medium
91        );
92        assert_eq!(PriorityLevel::from_str("low").unwrap(), PriorityLevel::Low);
93        assert!(PriorityLevel::from_str("invalid").is_err());
94    }
95
96    #[test]
97    fn test_priority_to_str() {
98        assert_eq!(PriorityLevel::to_str(1), "critical");
99        assert_eq!(PriorityLevel::to_str(2), "high");
100        assert_eq!(PriorityLevel::to_str(3), "medium");
101        assert_eq!(PriorityLevel::to_str(4), "low");
102        assert_eq!(PriorityLevel::to_str(999), "unknown");
103    }
104
105    #[test]
106    fn test_parse_optional() {
107        assert_eq!(
108            PriorityLevel::parse_optional(Some("high")).unwrap(),
109            Some(2)
110        );
111        assert_eq!(PriorityLevel::parse_optional(None).unwrap(), None);
112        assert!(PriorityLevel::parse_optional(Some("invalid")).is_err());
113    }
114}