1use crate::{meteo::Record, prelude::Observable};
2use std::str::FromStr;
3
4use qc_traits::{FilterItem, MaskFilter, MaskOperand};
5
6pub fn mask_mut(rec: &mut Record, mask: &MaskFilter) {
8 match mask.operand {
9 MaskOperand::Equals => match &mask.item {
10 FilterItem::EpochItem(epoch) => rec.retain(|k, _| k.epoch == *epoch),
11 FilterItem::ComplexItem(filter) => {
12 let observables = filter
14 .iter()
15 .filter_map(|f| {
16 if let Ok(ob) = Observable::from_str(f) {
17 Some(ob)
18 } else {
19 None
20 }
21 })
22 .collect::<Vec<_>>();
23 if observables.len() > 0 {
24 rec.retain(|k, _| observables.contains(&k.observable));
25 }
26 },
27 _ => {},
28 },
29 MaskOperand::NotEquals => match &mask.item {
30 FilterItem::EpochItem(epoch) => rec.retain(|k, _| k.epoch != *epoch),
31 FilterItem::ComplexItem(filter) => {
32 let observables = filter
34 .iter()
35 .filter_map(|f| {
36 if let Ok(ob) = Observable::from_str(f) {
37 Some(ob)
38 } else {
39 None
40 }
41 })
42 .collect::<Vec<_>>();
43 if observables.len() > 0 {
44 rec.retain(|k, _| !observables.contains(&k.observable));
45 }
46 },
47 _ => {},
48 },
49 MaskOperand::GreaterEquals => match &mask.item {
50 FilterItem::EpochItem(epoch) => rec.retain(|k, _| k.epoch >= *epoch),
51 _ => {},
52 },
53 MaskOperand::GreaterThan => match &mask.item {
54 FilterItem::EpochItem(epoch) => rec.retain(|k, _| k.epoch > *epoch),
55 _ => {},
56 },
57 MaskOperand::LowerEquals => match &mask.item {
58 FilterItem::EpochItem(epoch) => rec.retain(|k, _| k.epoch <= *epoch),
59 _ => {},
60 },
61 MaskOperand::LowerThan => match &mask.item {
62 FilterItem::EpochItem(epoch) => rec.retain(|k, _| k.epoch < *epoch),
63 _ => {},
64 },
65 }
66}