Skip to main content

rsigma_eval/event/
map.rs

1use std::borrow::Cow;
2use std::collections::HashMap;
3
4use serde_json::Value;
5
6use super::{Event, EventValue};
7
8/// Generic flat-map event for user-defined key-value stores.
9///
10/// Flat key lookup only (no dot-notation, no nesting).
11#[derive(Debug, Clone)]
12pub struct MapEvent<K = String, V = String>
13where
14    K: AsRef<str> + std::fmt::Debug + Clone,
15    V: AsRef<str> + std::fmt::Debug + Clone,
16{
17    inner: HashMap<K, V>,
18}
19
20impl<K, V> MapEvent<K, V>
21where
22    K: AsRef<str> + std::fmt::Debug + Clone,
23    V: AsRef<str> + std::fmt::Debug + Clone,
24{
25    pub fn new(inner: HashMap<K, V>) -> Self {
26        Self { inner }
27    }
28}
29
30impl<K, V> Event for MapEvent<K, V>
31where
32    K: AsRef<str> + std::fmt::Debug + Clone,
33    V: AsRef<str> + std::fmt::Debug + Clone,
34{
35    fn get_field(&self, path: &str) -> Option<EventValue<'_>> {
36        self.inner
37            .iter()
38            .find(|(k, _)| k.as_ref() == path)
39            .map(|(_, v)| EventValue::Str(Cow::Borrowed(v.as_ref())))
40    }
41
42    fn any_string_value(&self, pred: &dyn Fn(&str) -> bool) -> bool {
43        self.inner.values().any(|v| pred(v.as_ref()))
44    }
45
46    fn all_string_values(&self) -> Vec<Cow<'_, str>> {
47        self.inner
48            .values()
49            .map(|v| Cow::Borrowed(v.as_ref()))
50            .collect()
51    }
52
53    fn to_json(&self) -> Value {
54        let map: serde_json::Map<String, Value> = self
55            .inner
56            .iter()
57            .map(|(k, v)| {
58                (
59                    k.as_ref().to_string(),
60                    Value::String(v.as_ref().to_string()),
61                )
62            })
63            .collect();
64        Value::Object(map)
65    }
66}
67
68#[cfg(test)]
69mod tests {
70    use super::*;
71    use serde_json::json;
72
73    #[test]
74    fn map_event_get_field() {
75        let mut m = HashMap::new();
76        m.insert("user".to_string(), "admin".to_string());
77        let event = MapEvent::new(m);
78        assert_eq!(
79            event.get_field("user"),
80            Some(EventValue::Str(Cow::Borrowed("admin")))
81        );
82        assert_eq!(event.get_field("missing"), None);
83    }
84
85    #[test]
86    fn map_event_to_json() {
87        let mut m = HashMap::new();
88        m.insert("k".to_string(), "v".to_string());
89        let event = MapEvent::new(m);
90        assert_eq!(event.to_json(), json!({"k": "v"}));
91    }
92}