intent_engine/
priority.rs1use crate::error::{IntentError, Result};
2use std::str::FromStr;
3
4#[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 pub fn parse_to_int(s: &str) -> Result<i32> {
34 let level: PriorityLevel = s.parse()?;
35 Ok(level as i32)
36 }
37
38 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 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); }
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}