ezcal 0.3.4

Ergonomic iCalendar + vCard library for Rust
Documentation
use crate::common::content_line::fold_line;
use crate::ical::calendar::Calendar;

/// Serialize a `Calendar` to an iCalendar string.
pub(crate) fn write_calendar(cal: &Calendar) -> String {
    let mut out = String::new();

    write_line(&mut out, "BEGIN:VCALENDAR");
    write_line(&mut out, &format!("VERSION:{}", cal.version));
    write_line(&mut out, &format!("PRODID:{}", cal.prodid));

    if let Some(ref calscale) = cal.calscale {
        write_line(&mut out, &format!("CALSCALE:{}", calscale));
    }
    if let Some(ref method) = cal.method {
        write_line(&mut out, &format!("METHOD:{}", method));
    }
    if let Some(ref name) = cal.name {
        write_line(&mut out, &format!("X-WR-CALNAME:{}", name));
    }

    for prop in &cal.extra_properties {
        write_line(&mut out, &prop.to_string());
    }

    for event in &cal.events {
        write_line(&mut out, "BEGIN:VEVENT");
        for prop in event.to_properties() {
            write_line(&mut out, &prop.to_string());
        }
        for alarm in &event.alarms {
            write_line(&mut out, "BEGIN:VALARM");
            for prop in alarm.to_properties() {
                write_line(&mut out, &prop.to_string());
            }
            write_line(&mut out, "END:VALARM");
        }
        write_line(&mut out, "END:VEVENT");
    }

    for todo in &cal.todos {
        write_line(&mut out, "BEGIN:VTODO");
        for prop in todo.to_properties() {
            write_line(&mut out, &prop.to_string());
        }
        for alarm in &todo.alarms {
            write_line(&mut out, "BEGIN:VALARM");
            for prop in alarm.to_properties() {
                write_line(&mut out, &prop.to_string());
            }
            write_line(&mut out, "END:VALARM");
        }
        write_line(&mut out, "END:VTODO");
    }

    write_line(&mut out, "END:VCALENDAR");

    out
}

fn write_line(out: &mut String, line: &str) {
    out.push_str(&fold_line(line));
}