1use serde_json::Value;
2
3use std::collections::HashMap;
4
5use crate::item::Eventable;
6
7pub fn mask_filter(filter: &Value, candidate: &Value) -> bool {
8 match (filter, candidate) {
9 (Value::Object(map_a), Value::Object(map_b)) => {
10 for (key, value_a) in map_a {
11 match map_b.get(key) {
12 Some(value_b) => {
13 if !mask_filter(value_a, value_b) {
14 return false;
15 }
16 }
17 None => return false,
18 }
19 }
20 true
21 }
22 _ => filter == candidate,
23 }
24}
25
26pub fn remove_whitespace(s: &str) -> String {
27 s.chars().filter(|c| !c.is_whitespace()).collect()
28}
29
30pub fn matches<T: Eventable<T, PT> + PartialEq, PT: Clone>(item: &T, query: &PT) -> bool {
31 let mut after = item.clone();
32
33 let q = query.clone();
34
35 after.apply_some(q);
36
37 after == *item
38}
39
40pub fn filter_query<T: Eventable<T, PT> + PartialEq, PT: Clone>(
41 state: &HashMap<String, T>,
42 query: &PT,
43) -> HashMap<String, T> {
44 state
45 .iter()
46 .filter(|(_, v)| matches(*v, query))
47 .map(|(k, v)| (k.clone(), v.clone()))
48 .collect()
49}