use std::collections::{HashMap, HashSet};
use super::monitor::MonitorData;
#[derive(Debug, Clone)]
pub struct DataFlowGraph {
pub producers: HashMap<String, Vec<String>>,
pub consumers: HashMap<String, Vec<String>>,
pub topics: Vec<String>,
}
impl DataFlowGraph {
pub fn from_monitor_data(data: &MonitorData) -> Self {
let mut producers: HashMap<String, Vec<String>> = HashMap::new();
let mut consumers: HashMap<String, Vec<String>> = HashMap::new();
let mut topic_set: HashSet<String> = HashSet::new();
for module in &data.modules {
for write in &module.writes {
topic_set.insert(write.topic.clone());
producers
.entry(write.topic.clone())
.or_default()
.push(module.name.clone());
}
for read in &module.reads {
topic_set.insert(read.topic.clone());
consumers
.entry(read.topic.clone())
.or_default()
.push(module.name.clone());
}
}
let mut topics: Vec<String> = topic_set.into_iter().collect();
topics.sort();
Self {
producers,
consumers,
topics,
}
}
}