From 5cd02e689da064327ff291c02792cb9ee8bf8e7d Mon Sep 17 00:00:00 2001 From: Astro Date: Thu, 10 Oct 2019 18:42:49 +0200 Subject: [PATCH] extract_vevent_objs --- src/main.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 8e76c17..f4833bd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ #[macro_use] extern crate diesel; +use std::mem::replace; use std::io::Read; use std::fs::read_to_string; use std::sync::RwLock; @@ -18,6 +19,16 @@ use model::{Calendar, NewCalendar, Event}; mod ics; use ics::{Parser, Object, GetValue}; +fn extract_vevent_objs(results: &mut Vec, mut obj: Object) { + let children = replace(&mut obj.children, vec![]); + if obj.name == "VEVENT" { + results.push(obj); + } + for child in children.into_iter() { + extract_vevent_objs(results, *child); + } +} + fn obj_to_event(calendar: String, obj: Object) -> Option { if obj.name != "VEVENT" { return None; @@ -141,11 +152,15 @@ impl Resources { len if len > 0 => { let data = &buf[..len]; p.feed(data, |obj| { - let dbg = format!("{:?}", obj); - if let Some(event) = obj_to_event(cal_opts.url.clone(), obj) { - events.push(event); - } else { - println!("ignore {}", dbg); + let mut objs = vec![]; + extract_vevent_objs(&mut objs, obj); + for obj in objs { + let dbg = format!("{:?}", obj); + if let Some(event) = obj_to_event(cal_opts.url.clone(), obj) { + events.push(event); + } else { + println!("ignore {}", dbg); + } } }); }