cal7tor/src/ics.rs

40 lines
1.3 KiB
Rust
Raw Normal View History

2022-08-16 10:32:46 +02:00
use ics::{
properties::{Class, Description, DtEnd, DtStart, Location, Summary, Transp},
Event, ICalendar,
};
2022-08-16 11:54:47 +02:00
pub fn export(courses: Vec<crate::timetable::models::Course>, filename: &str) {
2022-08-16 10:32:46 +02:00
let mut calendar = ICalendar::new("2.0", "cal8tor");
2022-08-16 11:54:47 +02:00
// Create events which contains the information regarding the course
for course in courses {
let mut event = Event::new("uid", "dtstamp");
2022-08-16 10:32:46 +02:00
2022-08-16 11:54:47 +02:00
// Public event
event.push(Class::public());
// Consume actual time
event.push(Transp::opaque());
// Professor's name
event.push(Description::new(course.professor.unwrap_or_default()));
// Start time of the course
event.push(DtStart::new(dt_ical(course.dtstart.unwrap())));
// End time of the course
event.push(DtEnd::new(dt_ical(course.dtend.unwrap())));
// Room location
event.push(Location::new(course.room));
// Course's name
event.push(Summary::new(course.name));
2022-08-16 10:32:46 +02:00
2022-08-16 11:54:47 +02:00
// Add the course to the calendar
calendar.add_event(event);
}
2022-08-16 10:32:46 +02:00
calendar.save_file(filename).unwrap();
2022-08-16 10:32:46 +02:00
}
2022-08-16 11:54:47 +02:00
/// Transform the datetime from chrono to the ICS format
/// See https://github.com/hummingly/ics/issues/17#issue-985662287
fn dt_ical(dt: chrono::DateTime<chrono::Utc>) -> String {
format!("{}", dt.format("%Y%m%dT%H%M%SZ"))
}