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}