From 9e547b62e719e17c8704c9ef25685990a2102b08 Mon Sep 17 00:00:00 2001 From: Jeremiah Russell Date: Wed, 8 Oct 2025 06:16:41 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(config):=20implement=20display?= =?UTF-8?q?=20for=20eolrule=20struct?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add display trait implementation for eolrule struct to provide a user-friendly representation of the rule's configuration - the display format includes the rule id, labels, and retention period, making it easier to understand the rule's settings --- src/config/eol_rule.rs | 104 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/src/config/eol_rule.rs b/src/config/eol_rule.rs index 85a0bd3..598bdfe 100644 --- a/src/config/eol_rule.rs +++ b/src/config/eol_rule.rs @@ -1,3 +1,5 @@ +use std::fmt; + use serde::{Deserialize, Serialize}; use crate::{Retention, eol_cmd::EolCmd}; @@ -12,6 +14,55 @@ pub(crate) struct EolRule { command: String, } +impl fmt::Display for EolRule { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + if !self.retention.is_empty() { + let count = &self.retention[2..]; + let count = count.parse::().unwrap(); + let period = match self.retention.chars().nth(0) { + Some('d') => { + if count == 1 { + "day" + } else { + "days" + } + } + Some('w') => { + if count == 1 { + "week" + } else { + "weeks" + } + } + Some('m') => { + if count == 1 { + "month" + } else { + "months" + } + } + Some('y') => { + if count == 1 { + "year" + } else { + "years" + } + } + Some(_) => unreachable!(), + None => unreachable!(), + }; + write!( + f, + "Rule #{} is active on {} and applies when the message is {count} {period} old.", + self.id, + self.labels.join(", ") + ) + } else { + write!(f, "Complete retention rule not set.") + } + } +} + impl EolRule { pub(crate) fn new(id: usize) -> Self { EolRule { @@ -38,3 +89,56 @@ impl EolRule { self.id } } + +#[cfg(test)] +mod test { + use crate::{Retention, config::eol_rule::EolRule}; + + #[test] + fn test_display_for_eol_rule_5_years() { + let retention = Retention::new(crate::MessageAge::Years(5), true); + let mut rule = EolRule::new(1); + rule.set_retention(retention); + assert_eq!( + "Rule #1 is active on retention/5-years and applies when the message is 5 years old." + .to_string(), + rule.to_string() + ); + } + + #[test] + fn test_display_for_eol_rule_1_month() { + let retention = Retention::new(crate::MessageAge::Months(1), true); + let mut rule = EolRule::new(2); + rule.set_retention(retention); + assert_eq!( + "Rule #2 is active on retention/1-months and applies when the message is 1 month old." + .to_string(), + rule.to_string() + ); + } + + #[test] + fn test_display_for_eol_rule_13_weeks() { + let retention = Retention::new(crate::MessageAge::Weeks(13), true); + let mut rule = EolRule::new(3); + rule.set_retention(retention); + assert_eq!( + "Rule #3 is active on retention/13-weeks and applies when the message is 13 weeks old." + .to_string(), + rule.to_string() + ); + } + + #[test] + fn test_display_for_eol_rule_365_days() { + let retention = Retention::new(crate::MessageAge::Days(365), true); + let mut rule = EolRule::new(4); + rule.set_retention(retention); + assert_eq!( + "Rule #4 is active on retention/365-days and applies when the message is 365 days old." + .to_string(), + rule.to_string() + ); + } +}