rinex/meteo/
mask.rs

1use crate::{meteo::Record, prelude::Observable};
2use std::str::FromStr;
3
4use qc_traits::{FilterItem, MaskFilter, MaskOperand};
5
6/// Applies [MaskFilter] to [Record]
7pub 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                // try to interprate as [Observable]
13                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                // try to interprate as [Observable]
33                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}