use crate::chaos::state_handle::StateHandle;
use crate::network::SimNetworkProvider;
use crate::observability::SimulationLayerHandle;
use crate::providers::{SimProviders, SimRandomProvider, SimTimeProvider};
use crate::storage::SimStorageProvider;
use moonpool_core::Providers;
use super::topology::WorkloadTopology;
pub struct SimContext {
providers: SimProviders,
topology: WorkloadTopology,
state: StateHandle,
obs: SimulationLayerHandle,
}
impl SimContext {
#[must_use]
pub fn new(
providers: SimProviders,
topology: WorkloadTopology,
state: StateHandle,
obs: SimulationLayerHandle,
) -> Self {
Self {
providers,
topology,
state,
obs,
}
}
#[must_use]
pub fn providers(&self) -> &SimProviders {
&self.providers
}
#[must_use]
pub fn network(&self) -> &SimNetworkProvider {
self.providers.network()
}
#[must_use]
pub fn time(&self) -> &SimTimeProvider {
self.providers.time()
}
#[must_use]
pub fn task(&self) -> &crate::providers::SimTaskProvider {
self.providers.task()
}
#[must_use]
pub fn random(&self) -> &SimRandomProvider {
self.providers.random()
}
#[must_use]
pub fn storage(&self) -> &SimStorageProvider {
self.providers.storage()
}
#[must_use]
pub fn my_ip(&self) -> &str {
&self.topology.my_ip
}
#[must_use]
pub fn client_id(&self) -> usize {
self.topology.client_id
}
#[must_use]
pub fn client_count(&self) -> usize {
self.topology.client_count
}
#[must_use]
pub fn peer(&self, name: &str) -> Option<String> {
self.topology.peer_by_name(name)
}
#[must_use]
pub fn peers(&self) -> Vec<(String, String)> {
self.topology
.peer_names
.iter()
.zip(self.topology.peer_ips.iter())
.map(|(name, ip)| (name.clone(), ip.clone()))
.collect()
}
#[must_use]
pub fn shutdown(&self) -> &tokio_util::sync::CancellationToken {
&self.topology.shutdown_signal
}
#[must_use]
pub fn topology(&self) -> &WorkloadTopology {
&self.topology
}
#[must_use]
pub fn state(&self) -> &StateHandle {
&self.state
}
#[must_use]
pub fn observability(&self) -> &SimulationLayerHandle {
&self.obs
}
}