use icalendar; use icalendar::{Component, DatePerhapsTime, CalendarDateTime, CalendarComponent}; use chrono::NaiveDate; use crate::EventsCollection; use std::fs; fn cdt_as_date(cdt: &CalendarDateTime) -> NaiveDate { match cdt { CalendarDateTime::Floating(ndt) => ndt.date(), CalendarDateTime::Utc(ud) => ud.naive_local().date(), CalendarDateTime::WithTimezone{date_time, tzid: _} => date_time.date(), } } fn as_date(cal_date: &DatePerhapsTime) -> NaiveDate { match cal_date { DatePerhapsTime::DateTime(cdt) => cdt_as_date(cdt), DatePerhapsTime::Date(nd) => nd.clone() } } fn create_event(events: &mut EventsCollection, event: &icalendar::Event) { events.create(as_date(&event.get_start().unwrap()), as_date(&event.get_end().unwrap()).pred_opt().unwrap(), event.get_summary().unwrap()); } pub fn load_calendar(calendar_path: &std::path::Path, events: &mut EventsCollection) { let mut calendar = icalendar::Calendar::new(); let contents = fs::read_to_string(calendar_path) .expect("Could not read the calendar"); let res = icalendar::parser::read_calendar(&contents); match res { Ok(parsed_calendar) => { calendar.extend(parsed_calendar.components); } Err(e) => println!("{}", e) } for cc in calendar.iter() { match cc { CalendarComponent::Event(event) => create_event(events, event), _ => (), } } events.sort(); }