buswatch-tui 0.1.1

Diagnostic TUI for monitoring Caryatid message bus activity
Documentation
//! Data flow graph construction for visualizing producer/consumer relationships.

use std::collections::{HashMap, HashSet};

use super::monitor::MonitorData;

/// Data flow graph showing producer/consumer relationships.
///
/// Used by the Flow view to display which modules communicate
/// with each other via message bus topics.
#[derive(Debug, Clone)]
pub struct DataFlowGraph {
    /// Mapping of topic -> modules that write to it.
    pub producers: HashMap<String, Vec<String>>,
    /// Mapping of topic -> modules that read from it.
    pub consumers: HashMap<String, Vec<String>>,
    /// All unique topics, sorted alphabetically.
    pub topics: Vec<String>,
}

impl DataFlowGraph {
    /// Build a flow graph from monitor data.
    ///
    /// Extracts all read/write relationships and organizes them
    /// by topic for efficient lookup.
    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,
        }
    }
}