aboutsummaryrefslogtreecommitdiff
path: root/aero-ical/src/prune.rs
diff options
context:
space:
mode:
Diffstat (limited to 'aero-ical/src/prune.rs')
-rw-r--r--aero-ical/src/prune.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/aero-ical/src/prune.rs b/aero-ical/src/prune.rs
new file mode 100644
index 0000000..d04f700
--- /dev/null
+++ b/aero-ical/src/prune.rs
@@ -0,0 +1,40 @@
+use icalendar::parser::{Component, Property};
+use aero_dav::caltypes as cal;
+
+pub fn component<'a>(src: &'a Component<'a>, prune: &cal::Comp) -> Option<Component<'a>> {
+ if src.name.as_str() != prune.name.as_str() {
+ return None
+ }
+
+ let name = src.name.clone();
+
+ let properties = match &prune.prop_kind {
+ None => vec![],
+ Some(cal::PropKind::AllProp) => src.properties.clone(),
+ Some(cal::PropKind::Prop(l)) => src.properties.iter().filter_map(|prop| {
+ let sel_filt = match l.iter().find(|filt| filt.name.0.as_str() == prop.name.as_str()) {
+ Some(v) => v,
+ None => return None
+ };
+
+ match sel_filt.novalue {
+ None | Some(false) => Some(prop.clone()),
+ Some(true) => Some(Property {
+ name: prop.name.clone(),
+ params: prop.params.clone(),
+ val: "".into()
+ }),
+ }
+ }).collect::<Vec<_>>(),
+ };
+
+ let components = match &prune.comp_kind {
+ None => vec![],
+ Some(cal::CompKind::AllComp) => src.components.clone(),
+ Some(cal::CompKind::Comp(many_inner_prune)) => src.components.iter().filter_map(|src_component| {
+ many_inner_prune.iter().find_map(|inner_prune| component(src_component, inner_prune))
+ }).collect::<Vec<_>>(),
+ };
+
+ Some(Component { name, properties, components })
+}