icalendar 0.17.13

Strongly typed iCalendar builder and parser.
Documentation
use chrono::*;
use icalendar::*;

fn main() {
    let mut calendar = Calendar::new();

    let now = Utc::now();
    let soon = Utc::now() + Duration::minutes(12);
    let tomorrow = Utc::now() + Duration::days(1);

    let todo_test_audio = Todo::new()
        .summary("TODO with audio alarm -15min")
        .sequence(1)
        .starts(now)
        .due(soon)
        .status(TodoStatus::NeedsAction)
        .percent_complete(98)
        .alarm(
            Alarm::audio(-Duration::minutes(10))
                .duration_and_repeat(chrono::Duration::minutes(1), 4),
        )
        .done();

    let event_test_display = Event::new()
        .summary("test event")
        .description("here I have something really important to do")
        .starts(Utc::now() + Duration::minutes(5))
        .class(Class::Confidential)
        .ends(Utc::now() + Duration::hours(1))
        .alarm(
            Alarm::display(
                "you should test your implementation",
                Utc::now() + Duration::minutes(1),
            )
            .duration_and_repeat(chrono::Duration::minutes(1), 4),
        )
        .done();

    let todo_test_display = Todo::new()
        .summary("TODO with display alarm now + 1 min")
        .sequence(3)
        .starts(now)
        .due(soon)
        .status(TodoStatus::NeedsAction)
        .alarm(
            Alarm::display(
                "you should test your implementation",
                (-Duration::minutes(10), Related::End),
            )
            .duration_and_repeat(chrono::Duration::minutes(1), 4),
        )
        .done();

    let todo_taxes = Todo::new()
        .summary("Submit Income Taxes")
        .sequence(4)
        .starts(now)
        .due(tomorrow)
        .status(TodoStatus::NeedsAction)
        .alarm(
            Alarm::audio(now + Duration::minutes(1))
                .duration_and_repeat(chrono::Duration::minutes(1), 4),
        )
        .done();

    calendar.push(event_test_display);
    calendar.push(todo_test_audio);
    calendar.push(todo_test_display);
    calendar.push(todo_taxes);

    println!("{calendar}");

    #[cfg(feature = "parser")]
    {
        use std::str::FromStr;

        let source = calendar.to_string();
        let reparse = Calendar::from_str(&source).unwrap();
        println!("{reparse:#?}");
    }
}