]> nmode's Git Repositories - signal-cli/blob - client/src/transports/mod.rs
Compile UnixStream support only on unix systems
[signal-cli] / client / src / transports / mod.rs
1 use futures_util::{stream::StreamExt, Sink, SinkExt, Stream};
2 use jsonrpsee::core::client::{ReceivedMessage, TransportReceiverT, TransportSenderT};
3 use thiserror::Error;
4
5 #[cfg(unix)]
6 pub mod ipc;
7 mod stream_codec;
8 pub mod tcp;
9
10 #[derive(Debug, Error)]
11 enum Errors {
12 #[error("Other: {0}")]
13 Other(String),
14 #[error("Closed")]
15 Closed,
16 }
17
18 struct Sender<T: Send + Sink<String>> {
19 inner: T,
20 }
21
22 impl<T: Send + Sink<String, Error = impl std::error::Error> + Unpin + 'static> TransportSenderT
23 for Sender<T>
24 {
25 type Error = Errors;
26
27 async fn send(&mut self, body: String) -> Result<(), Self::Error> {
28 self.inner
29 .send(body)
30 .await
31 .map_err(|e| Errors::Other(format!("{e:?}")))?;
32 Ok(())
33 }
34
35 async fn close(&mut self) -> Result<(), Self::Error> {
36 self.inner
37 .close()
38 .await
39 .map_err(|e| Errors::Other(format!("{e:?}")))?;
40 Ok(())
41 }
42 }
43
44 struct Receiver<T: Send + Stream> {
45 inner: T,
46 }
47
48 impl<T: Send + Stream<Item = Result<String, std::io::Error>> + Unpin + 'static> TransportReceiverT
49 for Receiver<T>
50 {
51 type Error = Errors;
52
53 async fn receive(&mut self) -> Result<ReceivedMessage, Self::Error> {
54 match self.inner.next().await {
55 None => Err(Errors::Closed),
56 Some(Ok(msg)) => Ok(ReceivedMessage::Text(msg)),
57 Some(Err(e)) => Err(Errors::Other(format!("{e:?}"))),
58 }
59 }
60 }