pjson_rs/application/
shared.rs

1//! Shared application layer types
2//!
3//! This module contains types that are shared across multiple application services
4//! to avoid code duplication.
5
6/// Urgency level for priority adjustments across all application services
7#[derive(Debug, Clone, PartialEq)]
8pub enum AdjustmentUrgency {
9    Low,
10    Medium,
11    High,
12    Critical,
13}
14
15impl AdjustmentUrgency {
16    /// Convert to numeric urgency level for comparison
17    pub fn as_level(&self) -> u8 {
18        match self {
19            Self::Low => 1,
20            Self::Medium => 2,
21            Self::High => 3,
22            Self::Critical => 4,
23        }
24    }
25
26    /// Check if this urgency requires immediate action
27    pub fn is_immediate(&self) -> bool {
28        matches!(self, Self::High | Self::Critical)
29    }
30}
31
32impl PartialOrd for AdjustmentUrgency {
33    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
34        Some(self.cmp(other))
35    }
36}
37
38impl Ord for AdjustmentUrgency {
39    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
40        self.as_level().cmp(&other.as_level())
41    }
42}
43
44impl Eq for AdjustmentUrgency {}
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49
50    #[test]
51    fn test_adjustment_urgency_as_level() {
52        assert_eq!(AdjustmentUrgency::Low.as_level(), 1);
53        assert_eq!(AdjustmentUrgency::Medium.as_level(), 2);
54        assert_eq!(AdjustmentUrgency::High.as_level(), 3);
55        assert_eq!(AdjustmentUrgency::Critical.as_level(), 4);
56    }
57
58    #[test]
59    fn test_adjustment_urgency_is_immediate() {
60        assert!(!AdjustmentUrgency::Low.is_immediate());
61        assert!(!AdjustmentUrgency::Medium.is_immediate());
62        assert!(AdjustmentUrgency::High.is_immediate());
63        assert!(AdjustmentUrgency::Critical.is_immediate());
64    }
65
66    #[test]
67    fn test_adjustment_urgency_ordering() {
68        assert!(AdjustmentUrgency::Low < AdjustmentUrgency::Medium);
69        assert!(AdjustmentUrgency::Medium < AdjustmentUrgency::High);
70        assert!(AdjustmentUrgency::High < AdjustmentUrgency::Critical);
71    }
72
73    #[test]
74    fn test_adjustment_urgency_equality() {
75        assert_eq!(AdjustmentUrgency::Low, AdjustmentUrgency::Low);
76        assert_eq!(AdjustmentUrgency::Critical, AdjustmentUrgency::Critical);
77        assert_ne!(AdjustmentUrgency::Low, AdjustmentUrgency::High);
78    }
79
80    #[test]
81    fn test_adjustment_urgency_partial_ord() {
82        assert_eq!(
83            AdjustmentUrgency::Low.partial_cmp(&AdjustmentUrgency::Medium),
84            Some(std::cmp::Ordering::Less)
85        );
86        assert_eq!(
87            AdjustmentUrgency::High.partial_cmp(&AdjustmentUrgency::High),
88            Some(std::cmp::Ordering::Equal)
89        );
90        assert_eq!(
91            AdjustmentUrgency::Critical.partial_cmp(&AdjustmentUrgency::Low),
92            Some(std::cmp::Ordering::Greater)
93        );
94    }
95
96    #[test]
97    fn test_adjustment_urgency_clone() {
98        let urgency = AdjustmentUrgency::High;
99        let cloned = urgency.clone();
100        assert_eq!(urgency, cloned);
101    }
102
103    #[test]
104    fn test_adjustment_urgency_debug() {
105        let urgency = AdjustmentUrgency::Medium;
106        let debug_str = format!("{:?}", urgency);
107        assert!(debug_str.contains("Medium"));
108    }
109}