#[cfg(feature = "schema")]
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "snake_case")]
pub enum Priority {
Critical,
High,
#[default]
Normal,
Low,
}
impl PartialOrd for Priority {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Priority {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.weight().cmp(&other.weight())
}
}
impl Priority {
pub fn weight(&self) -> u8 {
match self {
Priority::Critical => 4,
Priority::High => 3,
Priority::Normal => 2,
Priority::Low => 1,
}
}
pub fn label(&self) -> &'static str {
match self {
Priority::Critical => "CRITICAL",
Priority::High => "HIGH",
Priority::Normal => "NORMAL",
Priority::Low => "LOW",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "snake_case")]
pub enum TaskHealth {
OnTrack,
AtRisk,
OffTrack,
}
impl TaskHealth {
pub fn label(&self) -> &'static str {
match self {
TaskHealth::OnTrack => "On Track",
TaskHealth::AtRisk => "At Risk",
TaskHealth::OffTrack => "Off Track",
}
}
pub fn emoji(&self) -> &'static str {
match self {
TaskHealth::OnTrack => "✅",
TaskHealth::AtRisk => "⚠️",
TaskHealth::OffTrack => "🚫",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ContextProfile {
#[default]
Always,
Conditional {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
task_types: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
user_states: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
task_health: Option<TaskHealth>,
},
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_priority_ordering() {
assert!(Priority::Critical > Priority::High);
assert!(Priority::High > Priority::Normal);
assert!(Priority::Normal > Priority::Low);
}
#[test]
fn test_priority_weight() {
assert_eq!(Priority::Critical.weight(), 4);
assert_eq!(Priority::High.weight(), 3);
assert_eq!(Priority::Normal.weight(), 2);
assert_eq!(Priority::Low.weight(), 1);
}
}