//! An agent's importance, set by the user: high, normal (the default), or //! low. It orders agents within a status (the list, and so the jump), and //! a low agent makes no sound. //! //! It belongs to the agent's conversation: pi's extension saves it in the //! session and reports it (`/importance`); other agents get it from //! `dingger importance`. The daemon writes it to the pane option //! `@dingger_importance` (unset for normal), which goes with the agent. #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)] pub enum Importance { Low, #[default] Normal, High, } impl Importance { pub fn parse(value: &str) -> Option { match value.trim() { "low" => Some(Importance::Low), "normal" => Some(Importance::Normal), "high" => Some(Importance::High), _ => None, } } /// A pane option's value: unset (empty) or anything unknown is normal. pub fn from_option(value: &str) -> Importance { Importance::parse(value).unwrap_or_default() } pub fn label(self) -> &'static str { match self { Importance::Low => "low", Importance::Normal => "normal", Importance::High => "high", } } /// The pane option's value: normal leaves it unset. pub fn option_value(self) -> &'static str { match self { Importance::Normal => "", other => other.label(), } } } #[cfg(test)] mod tests { use super::*; #[test] fn levels_order_and_round_trip_through_the_option() { assert!(Importance::High > Importance::Normal && Importance::Normal > Importance::Low); for level in [Importance::Low, Importance::Normal, Importance::High] { assert_eq!(Importance::from_option(level.option_value()), level); assert_eq!(Importance::parse(level.label()), Some(level)); } assert_eq!(Importance::from_option(""), Importance::Normal, "unset is normal"); assert_eq!(Importance::from_option("urgent"), Importance::Normal); assert_eq!(Importance::parse("urgent"), None); } }