Functional Weave
Code in Rust

todo.reschedule-recurrence@1.0.0

impl/python.py

833 bytes · the Python implementation · view raw

Imports name this capability’s declared dependencies, which fune builds next to it in your project; each one links to its page.

from dataclasses import replace
from typing import Optional

from .dates_add_days import add_days  ← from dates.add-days ^1.0.0 · built alongside by fune
from .todo_item import Recurrence  ← from todo.item ^1.0.0 · built alongside by fune


def reschedule_recurrence(
    recurrence: Optional[Recurrence], from_due: Optional[str], to_due: Optional[str]
) -> Optional[Recurrence]:
    """The repeat a todo keeps when its due date is edited: a moved date becomes the anchor."""
    # add_days(x, 0) is the date check: it raises dates.add-days's message.
    if from_due is not None:
        add_days(from_due, 0)
    if to_due is not None:
        add_days(to_due, 0)
    if recurrence is None:
        return None
    add_days(recurrence.anchor, 0)
    # No date: todo.item's validate_draft says a repeating todo needs one.
    if to_due is None or to_due == from_due:
        return recurrence
    return replace(recurrence, anchor=to_due)