calendar-link 0.0.5

Rust library to generate an event link for Google Calendar, Yahoo! Calendar, Microsoft Outlook, etc.
Documentation
use crate::{err::MyResult, stringify::make_url, time::EventTimeFormat, typ::CalendarEvent};
use std::borrow::Cow;

pub fn google(event: &CalendarEvent) -> MyResult<String> {
    let mut p = vec![(Cow::Borrowed("action"), Cow::Borrowed("TEMPLATE"))];

    if let Some(x) = &event.guests {
        if !x.is_empty() {
            p.push((Cow::Borrowed("add"), Cow::Owned(x.join(","))));
        }
    }

    let dates = {
        let fmt_typ = if event.is_all_day() {
            EventTimeFormat::AllDay
        } else {
            EventTimeFormat::DateTimeUtc
        };
        format!(
            "{}/{}",
            event.start.format_as_string(fmt_typ),
            event.end_date().format_as_string(fmt_typ)
        )
    };
    p.push((Cow::Borrowed("dates"), Cow::Owned(dates)));

    if let Some(x) = event.desc {
        p.push((Cow::Borrowed("details"), Cow::Borrowed(x)));
    }
    if let Some(x) = event.r_rule {
        p.push((Cow::Borrowed("recur"), Cow::Owned(format!("RRULE:{}", x))));
    }

    p.push((Cow::Borrowed("text"), Cow::Borrowed(event.title)));

    if let Some(x) = event.busy {
        p.push((Cow::Borrowed("trp"), Cow::Owned(x.to_string())));
    }

    make_url(
        "https://calendar.google.com/calendar/render",
        p.iter().map(|(x, y)| (x.as_ref(), y.as_ref())),
    )
}

#[cfg(test)]
mod tests {
    use crate::prelude::google;
    use crate::providers::__snapshot__::{generate_models, read_snapshot};

    #[test]
    fn should_provide_google_calendar_link() {
        let snapshot = read_snapshot();
        let models = generate_models();
        let mut cases = snapshot.get("google").unwrap().into_iter();
        for (i, evt) in models.iter().enumerate() {
            let act = google(evt).expect("cannot parse google event");
            let exp = cases.next().expect("sequence contains no elements");
            assert_eq!(&act, exp, "failed at index {i}, evt: {evt:?}");
        }
    }
}