// icaltool - a tool to get information out of ical/ics files. // Copyright (C) 2018 Harald Eilertsen // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . use ical; use chrono::{DateTime, TimeZone, Utc}; use std::fs::File; use std::io::BufReader; fn parse_datetime(datetime: Option) -> Option> { if let Some(mut dt) = datetime { if dt.is_empty() { return None; } if !dt.contains("T") { dt += "T000000"; } Utc.datetime_from_str(&dt, "%Y%m%dT%H%M%S").ok() } else { None } } fn print_event(event: &ical::parser::ical::component::IcalEvent) { let mut start: Option> = None; let mut end: Option> = None; let mut summary = String::new(); for ref p in &event.properties { match p.name.as_ref() { "DTSTART" => start = parse_datetime(p.value.clone()), "DTEND" => end = parse_datetime(p.value.clone()), "SUMMARY" => summary = p.value.clone().unwrap_or("".to_string()), _ => (), } } println!("---> {} - {}: {}", start.unwrap_or(Utc::now()), end.unwrap_or(Utc::now()), summary); } fn read_icalendar_from_file(filename: &str) -> std::io::Result> { let buf = BufReader::new(File::open(filename)?); Ok(ical::IcalParser::new(buf) .filter_map(|c| c.ok()) .collect()) } fn match_event(_event: &ical::parser::ical::component::IcalEvent, _pattern: &str) -> bool { true } #[test] fn match_all_events() { let cal = read_icalendar_from_file("test/fixtures/events.ics").unwrap(); let num_events = cal[0].events.len(); let events:Vec<_> = cal[0].events.iter().filter(|ref event| match_event(&event, "*")).collect(); assert_eq!(num_events, events.len()); } fn main() { let calendars = read_icalendar_from_file("test.ics").unwrap(); println!("Found {} calendard in file...", calendars.len()); for c in calendars { for e in c.events { print_event(&e); } } }