Skip to main content

chat_system/messengers/
console.rs

1//! Console messenger — stdin/stdout implementation for testing.
2
3use crate::{Message, Messenger};
4use anyhow::Result;
5use async_trait::async_trait;
6
7pub struct ConsoleMessenger {
8    name: String,
9    connected: bool,
10    messages: Vec<Message>,
11}
12
13impl ConsoleMessenger {
14    pub fn new(name: impl Into<String>) -> Self {
15        Self {
16            name: name.into(),
17            connected: false,
18            messages: Vec::new(),
19        }
20    }
21
22    /// Queue a message to be returned by `receive_messages`.
23    pub fn enqueue(&mut self, message: Message) {
24        self.messages.push(message);
25    }
26}
27
28#[async_trait]
29impl Messenger for ConsoleMessenger {
30    fn name(&self) -> &str {
31        &self.name
32    }
33
34    fn messenger_type(&self) -> &str {
35        "console"
36    }
37
38    async fn initialize(&mut self) -> Result<()> {
39        self.connected = true;
40        println!("[{}] Console messenger initialized.", self.name);
41        Ok(())
42    }
43
44    async fn send_message(&self, recipient: &str, content: &str) -> Result<String> {
45        println!("[{}] → {}: {}", self.name, recipient, content);
46        Ok(format!("console:{}", chrono::Utc::now().timestamp_millis()))
47    }
48
49    async fn receive_messages(&self) -> Result<Vec<Message>> {
50        // Clone is intentional: ConsoleMessenger is a test double and callers
51        // may call receive_messages multiple times against the same queued data.
52        Ok(self.messages.clone())
53    }
54
55    fn is_connected(&self) -> bool {
56        self.connected
57    }
58
59    async fn disconnect(&mut self) -> Result<()> {
60        self.connected = false;
61        println!("[{}] Console messenger disconnected.", self.name);
62        Ok(())
63    }
64}