use crate::aggregators::StateAggregator;
use crate::model::{NodeType, StateEdge, StateLayer, StateNode};
use async_trait::async_trait;
use mockforge_core::time_travel::VirtualClock;
use std::sync::Arc;
pub struct TimeAggregator {
virtual_clock: Option<Arc<VirtualClock>>,
}
impl TimeAggregator {
pub fn new(virtual_clock: Option<Arc<VirtualClock>>) -> Self {
Self { virtual_clock }
}
}
#[async_trait]
impl StateAggregator for TimeAggregator {
async fn aggregate(&self) -> anyhow::Result<(Vec<StateNode>, Vec<StateEdge>)> {
let mut nodes = Vec::new();
let edges = Vec::new();
if let Some(ref clock) = self.virtual_clock {
let mut time_node = StateNode::new(
"time:virtual_clock".to_string(),
"Virtual Clock".to_string(),
NodeType::System,
StateLayer::Time,
);
let now = clock.now();
let enabled = clock.is_enabled();
let scale = clock.get_scale();
time_node.set_property("enabled".to_string(), serde_json::json!(enabled));
time_node.set_property("current_time".to_string(), serde_json::json!(now.to_rfc3339()));
time_node.set_property("scale_factor".to_string(), serde_json::json!(scale));
if enabled {
time_node.set_state("enabled".to_string());
} else {
time_node.set_state("disabled".to_string());
}
nodes.push(time_node);
}
Ok((nodes, edges))
}
fn layer(&self) -> StateLayer {
StateLayer::Time
}
}