1use super::*;
2
3mod platform;
4
5pub struct Connection<S: Message, C: Message> {
6 inner: platform::Connection<S, C>,
7}
8
9impl<S: Message, C: Message> Connection<S, C> {
10 pub fn traffic(&self) -> Traffic {
11 self.inner.traffic()
12 }
13 pub fn send(&mut self, message: C) {
14 self.inner.send(message);
15 }
16 pub fn try_recv(&mut self) -> Option<anyhow::Result<S>> {
17 self.inner.try_recv()
18 }
19 pub fn new_messages(&mut self) -> NewMessages<S, C> {
20 NewMessages { connection: self }
21 }
22}
23
24impl<S: Message, C: Message> Stream for Connection<S, C> {
25 type Item = anyhow::Result<S>;
26 fn poll_next(
27 self: Pin<&mut Self>,
28 cx: &mut std::task::Context,
29 ) -> std::task::Poll<Option<Self::Item>> {
30 Stream::poll_next(unsafe { self.map_unchecked_mut(|pin| &mut pin.inner) }, cx)
31 }
32}
33
34pub struct NewMessages<'a, S: Message, C: Message> {
35 connection: &'a mut Connection<S, C>,
36}
37
38impl<'a, S: Message, C: Message> Iterator for NewMessages<'a, S, C> {
39 type Item = anyhow::Result<S>;
40 fn next(&mut self) -> Option<anyhow::Result<S>> {
41 self.connection.try_recv()
42 }
43}
44
45impl<S: Message, C: Message> Sender<C> for Connection<S, C> {
46 fn send(&mut self, message: C) {
47 self.send(message);
48 }
49 fn send_serialized(&mut self, _data: Arc<Vec<u8>>) {
50 unimplemented!()
51 }
52}
53
54pub fn connect<S: Message, C: Message>(
55 addr: &str,
56) -> impl Future<Output = anyhow::Result<Connection<S, C>>> {
57 platform::connect(addr).map(|result| result.map(|inner| Connection { inner }))
58}