Skip to main content

moonpool_sim/providers/
sim_providers.rs

1//! Simulation providers bundle implementation.
2
3use moonpool_core::{Providers, TokioTaskProvider};
4
5use crate::network::SimNetworkProvider;
6use crate::sim::WeakSimWorld;
7
8use super::{SimRandomProvider, SimTimeProvider};
9
10/// Simulation providers bundle for deterministic testing.
11///
12/// This struct bundles all four simulation-based providers into a single
13/// instance that implements [`Providers`].
14///
15/// ## Usage
16///
17/// `SimProviders` is typically created by the simulation framework during
18/// workload setup, but can also be manually constructed:
19///
20/// ```rust,ignore
21/// use moonpool_sim::{SimWorld, SimProviders, Providers};
22///
23/// let sim = SimWorld::new();
24/// let providers = SimProviders::new(sim.downgrade(), 42);
25///
26/// // Access individual providers
27/// let network = providers.network();
28/// let time = providers.time();
29/// ```
30///
31/// ## Implementation Notes
32///
33/// - Uses `SimNetworkProvider` for simulated TCP connections
34/// - Uses `SimTimeProvider` for logical/simulated time
35/// - Uses `TokioTaskProvider` for task spawning (same as production)
36/// - Uses `SimRandomProvider` for seeded deterministic randomness
37#[derive(Clone)]
38pub struct SimProviders {
39    network: SimNetworkProvider,
40    time: SimTimeProvider,
41    task: TokioTaskProvider,
42    random: SimRandomProvider,
43}
44
45impl SimProviders {
46    /// Create a new simulation providers bundle.
47    ///
48    /// # Arguments
49    ///
50    /// * `sim` - Weak reference to the simulation world
51    /// * `seed` - Seed for deterministic random number generation
52    pub fn new(sim: WeakSimWorld, seed: u64) -> Self {
53        Self {
54            network: SimNetworkProvider::new(sim.clone()),
55            time: SimTimeProvider::new(sim),
56            task: TokioTaskProvider,
57            random: SimRandomProvider::new(seed),
58        }
59    }
60}
61
62impl Providers for SimProviders {
63    type Network = SimNetworkProvider;
64    type Time = SimTimeProvider;
65    type Task = TokioTaskProvider;
66    type Random = SimRandomProvider;
67
68    fn network(&self) -> &Self::Network {
69        &self.network
70    }
71
72    fn time(&self) -> &Self::Time {
73        &self.time
74    }
75
76    fn task(&self) -> &Self::Task {
77        &self.task
78    }
79
80    fn random(&self) -> &Self::Random {
81        &self.random
82    }
83}