1
//! Declare MockNetRuntime.
2

            
3
// TODO(nickm): This is mostly copy-paste from MockSleepRuntime.  If possible,
4
// we should make it so that more code is more shared.
5

            
6
use crate::util::impl_runtime_prelude::*;
7

            
8
use crate::net::MockNetProvider;
9

            
10
/// A wrapper Runtime that overrides the SleepProvider trait for the
11
/// underlying runtime.
12
#[derive(Clone, Debug, Deftly)]
13
#[derive_deftly(SomeMockRuntime)]
14
pub struct MockNetRuntime<R: Runtime> {
15
    /// The underlying runtime. Most calls get delegated here.
16
    #[deftly(mock(task, sleep))]
17
    #[deftly(mock(toplevel_where = "R: ToplevelBlockOn"))]
18
    runtime: R,
19
    /// A MockNetProvider.  Network-related calls get delegated here.
20
    #[deftly(mock(net))]
21
    net: MockNetProvider,
22
}
23

            
24
impl<R: Runtime> MockNetRuntime<R> {
25
    /// Create a new runtime that wraps `runtime`, but overrides
26
    /// its view of the network with a [`MockNetProvider`], `net`.
27
8
    pub fn new(runtime: R, net: MockNetProvider) -> Self {
28
8
        MockNetRuntime { runtime, net }
29
8
    }
30

            
31
    /// Return a reference to the underlying runtime.
32
    pub fn inner(&self) -> &R {
33
        &self.runtime
34
    }
35

            
36
    /// Return a reference to the [`MockNetProvider`]
37
6
    pub fn mock_net(&self) -> &MockNetProvider {
38
6
        &self.net
39
6
    }
40
}