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