1use std::borrow::Cow;
2use std::collections::HashMap;
3
4use serde_json::Value;
5
6use super::{Event, EventValue};
7
8#[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}