use super::funejson::Value; use super::dates_add_days::add_days; use super::todo_item::Recurrence; use super::todo_item_validate_draft::{recurrence_from_value, recurrence_to_value}; /// The repeat a todo keeps when its due date is edited: a moved date becomes /// the anchor; an unchanged date keeps it (so a month-end series that has /// rolled forward stays on the month end). /// /// # Panics /// On a malformed or impossible date (dates.add-days's message). pub fn reschedule_recurrence(recurrence: Option<&Recurrence>, from_due: Option<&str>, to_due: Option<&str>) -> Option { if let Some(date) = from_due { add_days(date, 0); } if let Some(date) = to_due { add_days(date, 0); } let rule = recurrence?; add_days(&rule.anchor, 0); match to_due { Some(date) if Some(date) != from_due => Some(Recurrence { anchor: date.to_string(), ..rule.clone() }), _ => Some(rule.clone()), } } fn opt_date(v: &Value) -> Option<&str> { if v.is_null() { None } else { Some(v.as_str()) } } pub fn fune_vector(args: &[Value]) -> Value { let rule = recurrence_from_value(&args[0]); recurrence_to_value(&reschedule_recurrence(rule.as_ref(), opt_date(&args[1]), opt_date(&args[2]))) }