use serde::Serialize;
use crate::event::{Event, EventValue};
use super::types::GroupByField;
#[derive(Debug, Clone, Hash, Eq, PartialEq, Serialize, serde::Deserialize)]
pub struct GroupKey(pub Vec<Option<String>>);
impl GroupKey {
pub fn extract(event: &impl Event, group_by: &[GroupByField], rule_refs: &[&str]) -> Self {
let values = group_by
.iter()
.map(|field| {
let field_name = field.resolve(rule_refs);
event
.get_field(field_name)
.and_then(|v| value_to_string(&v))
})
.collect();
GroupKey(values)
}
pub fn from_pairs(pairs: &[(String, String)], group_by: &[GroupByField]) -> Self {
let values = group_by
.iter()
.map(|field| {
let name = field.name();
pairs
.iter()
.find(|(k, _)| k == name)
.map(|(_, v)| v.clone())
})
.collect();
GroupKey(values)
}
pub fn to_pairs(&self, group_by: &[GroupByField]) -> Vec<(String, String)> {
group_by
.iter()
.zip(self.0.iter())
.filter_map(|(field, value)| {
value
.as_ref()
.map(|v| (field.name().to_string(), v.clone()))
})
.collect()
}
}
fn value_to_string(v: &EventValue) -> Option<String> {
match v {
EventValue::Str(s) => Some(s.to_string()),
EventValue::Int(n) => Some(n.to_string()),
EventValue::Float(f) => Some(f.to_string()),
EventValue::Bool(b) => Some(b.to_string()),
_ => None,
}
}