aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2024-05-26 15:31:12 +0200
committerQuentin Dufour <quentin@deuxfleurs.fr>2024-05-26 15:31:12 +0200
commit68e08bed4f8f589d2e45bcd82a99090032a56b95 (patch)
tree3daf1cc32e2dd4e7107e952984aeb0254c31a3c4
parentac528d215646b1d82799fafc4211ade3558074ff (diff)
downloadaerogramme-68e08bed4f8f589d2e45bcd82a99090032a56b95.tar.gz
aerogramme-68e08bed4f8f589d2e45bcd82a99090032a56b95.zip
add prune logic
-rw-r--r--aero-ical/src/lib.rs1
-rw-r--r--aero-ical/src/prune.rs40
2 files changed, 41 insertions, 0 deletions
diff --git a/aero-ical/src/lib.rs b/aero-ical/src/lib.rs
index f6b4ad4..696010a 100644
--- a/aero-ical/src/lib.rs
+++ b/aero-ical/src/lib.rs
@@ -5,3 +5,4 @@
/// integrates into Aerogramme
pub mod parser;
pub mod query;
+pub mod prune;
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 })
+}