use chrono::NaiveDate;
use clap::ValueEnum;
use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ValueEnum)]
#[serde(rename_all = "lowercase")]
pub enum Recurrence {
Daily,
Weekly,
Monthly,
}
impl fmt::Display for Recurrence {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match self {
Recurrence::Daily => "daily",
Recurrence::Weekly => "weekly",
Recurrence::Monthly => "monthly",
};
write!(f, "{}", s)
}
}
impl Recurrence {
pub fn next_date(&self, from_date: NaiveDate) -> NaiveDate {
use chrono::Duration;
match self {
Recurrence::Daily => from_date + Duration::days(1),
Recurrence::Weekly => from_date + Duration::days(7),
Recurrence::Monthly => from_date
.checked_add_months(chrono::Months::new(1))
.unwrap_or(from_date),
}
}
}