rs-calendar/src/model/ical_bridge.rs

51 lines
1.6 KiB
Rust

use icalendar;
use icalendar::{Component, DatePerhapsTime, CalendarDateTime, CalendarComponent};
use chrono::NaiveDate;
use crate::EventsCollection;
use std::fs;
use log::warn;
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 = match fs::read_to_string(calendar_path) {
Ok(file_content) => file_content,
Err(e) => { warn!("Could not read the calendar: {}", e); return; },
};
let res = icalendar::parser::read_calendar(&contents);
match res {
Ok(parsed_calendar) => { calendar.extend(parsed_calendar.components); },
Err(e) => { warn!("Error parsing calendar {}", e); return; }
}
for cc in calendar.iter() {
match cc {
CalendarComponent::Event(event) => create_event(events, event),
_ => (),
}
}
events.sort();
}