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}