rsigma_eval/correlation/
keys.rs1use serde::Serialize;
2
3use crate::event::{Event, EventValue};
4
5use super::types::GroupByField;
6
7#[derive(Debug, Clone, Hash, Eq, PartialEq, Serialize, serde::Deserialize)]
16pub struct GroupKey(pub Vec<Option<String>>);
17
18impl GroupKey {
19 pub fn extract(event: &impl Event, group_by: &[GroupByField], rule_refs: &[&str]) -> Self {
22 let values = group_by
23 .iter()
24 .map(|field| {
25 let field_name = field.resolve(rule_refs);
26 event
27 .get_field(field_name)
28 .and_then(|v| value_to_string(&v))
29 })
30 .collect();
31 GroupKey(values)
32 }
33
34 pub fn from_pairs(pairs: &[(String, String)], group_by: &[GroupByField]) -> Self {
36 let values = group_by
37 .iter()
38 .map(|field| {
39 let name = field.name();
40 pairs
41 .iter()
42 .find(|(k, _)| k == name)
43 .map(|(_, v)| v.clone())
44 })
45 .collect();
46 GroupKey(values)
47 }
48
49 pub fn to_pairs(&self, group_by: &[GroupByField]) -> Vec<(String, String)> {
51 group_by
52 .iter()
53 .zip(self.0.iter())
54 .filter_map(|(field, value)| {
55 value
56 .as_ref()
57 .map(|v| (field.name().to_string(), v.clone()))
58 })
59 .collect()
60 }
61}
62
63fn value_to_string(v: &EventValue) -> Option<String> {
65 match v {
66 EventValue::Str(s) => Some(s.to_string()),
67 EventValue::Int(n) => Some(n.to_string()),
68 EventValue::Float(f) => Some(f.to_string()),
69 EventValue::Bool(b) => Some(b.to_string()),
70 _ => None,
71 }
72}