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 yahoo(event: &CalendarEvent) -> MyResult<String> {
    let mut p = vec![
        (Cow::Borrowed("v"), Cow::Borrowed("60")),
        (Cow::Borrowed("title"), Cow::Borrowed(event.title)),
    ];

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

    if let Some(x) = event.desc {
        p.push((Cow::Borrowed("desc"), Cow::Borrowed(x)));
    }
    if let Some(x) = event.location {
        p.push((Cow::Borrowed("in_loc"), Cow::Borrowed(x)));
    }
    if event.is_all_day() {
        p.push((Cow::Borrowed("dur"), Cow::Borrowed("allday")));
    } else {
        p.push((Cow::Borrowed("dur"), Cow::Borrowed("false")));
    }

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

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

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