umbral_socket/stream/
client.rs

1use std::io;
2use std::sync::Arc;
3
4use bytes::Bytes;
5use tokio::io::AsyncWriteExt;
6use tokio::net::UnixStream;
7use tokio::sync::Mutex;
8
9struct ClientState {
10    stream: Mutex<Option<UnixStream>>,
11    socket: String,
12}
13
14#[derive(Clone)]
15pub struct Client {
16    state: Arc<ClientState>,
17}
18
19impl Client {
20    pub fn new(socket: &str) -> Self {
21        let state = Arc::new(ClientState {
22            stream: Mutex::new(None),
23            socket: String::from(socket),
24        });
25        Self { state }
26    }
27
28    pub async fn send(&self, data: &Bytes) -> io::Result<()> {
29        let mut stream_guard = self.state.stream.lock().await;
30
31        if stream_guard.is_none() {
32            match UnixStream::connect(&self.state.socket).await {
33                Ok(stream) => *stream_guard = Some(stream),
34                Err(e) => return Err(e),
35            }
36        }
37
38        if let Some(stream) = stream_guard.as_mut() {
39            if let Err(e) = stream.write_all(data).await {
40                *stream_guard = None;
41                return Err(e);
42            }
43        }
44
45        Ok(())
46    }
47}