Skip to main content

maolan_engine/
client.rs

1use std::sync::Arc;
2use tokio::task::JoinHandle;
3
4use super::init;
5use super::message::Message;
6use tokio::sync::mpsc::{Receiver, Sender, channel};
7
8#[derive(Debug, Clone)]
9pub struct Client {
10    pub sender: Sender<Message>,
11    _handle: Arc<JoinHandle<()>>,
12}
13
14impl Default for Client {
15    fn default() -> Self {
16        let (sender, handle) = init();
17        Self {
18            sender,
19            _handle: Arc::new(handle),
20        }
21    }
22}
23
24impl Client {
25    pub async fn subscribe(&self) -> Receiver<Message> {
26        let (tx, rx) = channel::<Message>(32);
27        self.sender
28            .send(Message::Channel(tx))
29            .await
30            .expect("Failed to subscribe to engine");
31        rx
32    }
33
34    pub async fn send(&self, message: Message) -> Result<(), String> {
35        self.sender
36            .send(message)
37            .await
38            .map_err(|e| format!("Failed to send message from client: {:?}", e))
39    }
40}