myko_rs/
utils.rs

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}