use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Event {
pub name: String,
pub timestamp: Option<String>,
pub lifecycle: Option<String>,
pub attributes: BTreeMap<String, String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Trace {
pub case_id: String,
pub events: Vec<Event>,
}
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
pub struct EventLog {
pub traces: Vec<Trace>,
}
impl EventLog {
pub fn activities(&self) -> Vec<String> {
let mut set: std::collections::BTreeSet<String> = Default::default();
for trace in &self.traces {
for event in &trace.events {
set.insert(event.name.clone());
}
}
set.into_iter().collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
fn make_trace(case_id: &str, acts: &[&str]) -> Trace {
Trace {
case_id: case_id.to_string(),
events: acts
.iter()
.map(|&a| Event {
name: a.to_string(),
timestamp: None,
lifecycle: None,
attributes: BTreeMap::new(),
})
.collect(),
}
}
#[test]
fn activities_extraction() {
let log = EventLog {
traces: vec![make_trace("c1", &["A", "B"]), make_trace("c2", &["A", "C"])],
};
assert_eq!(log.activities(), vec!["A", "B", "C"]);
}
}