use crate::aggregators::StateAggregator;
use crate::model::{NodeType, StateEdge, StateLayer, StateNode};
use async_trait::async_trait;
use mockforge_data::persona_graph::PersonaGraph;
use std::sync::Arc;
pub struct PersonaAggregator {
persona_graph: Option<Arc<PersonaGraph>>,
}
impl PersonaAggregator {
pub fn new(persona_graph: Option<Arc<PersonaGraph>>) -> Self {
Self { persona_graph }
}
}
#[async_trait]
impl StateAggregator for PersonaAggregator {
async fn aggregate(&self) -> anyhow::Result<(Vec<StateNode>, Vec<StateEdge>)> {
let mut nodes = Vec::new();
let mut edges = Vec::new();
if let Some(ref graph) = self.persona_graph {
let graph_nodes = graph.get_all_nodes();
for node in graph_nodes {
let mut state_node = StateNode::new(
node.persona_id.clone(),
format!("Persona: {}", node.persona_id),
NodeType::Persona,
StateLayer::Personas,
);
state_node
.set_property("entity_type".to_string(), serde_json::json!(node.entity_type));
for (rel_type, related_ids) in &node.relationships {
state_node.set_property(
format!("relationship_{}", rel_type),
serde_json::json!(related_ids),
);
}
nodes.push(state_node);
for (rel_type, related_ids) in &node.relationships {
for related_id in related_ids {
let edge = StateEdge::new(
node.persona_id.clone(),
related_id.clone(),
rel_type.clone(),
);
edges.push(edge);
}
}
}
}
Ok((nodes, edges))
}
fn layer(&self) -> StateLayer {
StateLayer::Personas
}
}