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