Skip to main content

nysiris_testkit/
lib.rs

1#![warn(missing_docs)]
2//! In-memory transport for tests and the Phase 0 mock daemon mode.
3
4use std::sync::{Arc, Mutex};
5
6use nysiris_core::error::Result;
7use nysiris_core::transport::{SentPayload, Transport};
8
9/// A transport that records what it was asked to send, without any network.
10#[derive(Clone, Default)]
11pub struct MemoryTransport {
12    sent: Arc<Mutex<Vec<SentPayload>>>,
13}
14
15impl MemoryTransport {
16    /// Create an empty transport.
17    pub fn new() -> Self {
18        Self::default()
19    }
20
21    /// A copy of everything recorded so far, without draining it.
22    pub fn sent(&self) -> Vec<SentPayload> {
23        self.sent.lock().expect("transport lock").clone()
24    }
25
26    /// Drain and return everything recorded so far.
27    pub fn take(&self) -> Vec<SentPayload> {
28        std::mem::take(&mut *self.sent.lock().expect("transport lock"))
29    }
30
31    /// Number of recorded payloads.
32    pub fn len(&self) -> usize {
33        self.sent.lock().expect("transport lock").len()
34    }
35
36    /// Whether nothing has been recorded.
37    pub fn is_empty(&self) -> bool {
38        self.len() == 0
39    }
40}
41
42impl Transport for MemoryTransport {
43    fn name(&self) -> &'static str {
44        "memory"
45    }
46
47    fn send(&self, recipient: &str, payload: Vec<u8>) -> Result<()> {
48        self.sent.lock().expect("transport lock").push(SentPayload {
49            recipient: recipient.to_string(),
50            payload,
51        });
52        Ok(())
53    }
54}