websocket_base/ws/
receiver.rs1use crate::result::WebSocketResult;
7use crate::ws::dataframe::DataFrame;
8use crate::ws::Message;
9use std::io::Read;
10
11pub trait Receiver: Sized {
13 type F: DataFrame;
15
16 type M: Message;
18
19 fn recv_dataframe<R>(&mut self, reader: &mut R) -> WebSocketResult<Self::F>
21 where
22 R: Read;
23
24 fn recv_message_dataframes<R>(&mut self, reader: &mut R) -> WebSocketResult<Vec<Self::F>>
26 where
27 R: Read;
28
29 fn incoming_dataframes<'a, R>(&'a mut self, reader: &'a mut R) -> DataFrameIterator<'a, Self, R>
31 where
32 R: Read,
33 {
34 DataFrameIterator {
35 reader,
36 inner: self,
37 }
38 }
39
40 fn recv_message<R>(&mut self, reader: &mut R) -> WebSocketResult<Self::M>
42 where
43 R: Read,
44 {
45 let dataframes = self.recv_message_dataframes(reader)?;
46 Self::M::from_dataframes(dataframes)
47 }
48
49 fn incoming_messages<'a, R>(&'a mut self, reader: &'a mut R) -> MessageIterator<'a, Self, R>
51 where
52 R: Read,
53 {
54 MessageIterator {
55 reader,
56 inner: self,
57 }
58 }
59}
60
61pub struct DataFrameIterator<'a, Recv, R>
63where
64 Recv: 'a + Receiver,
65 R: 'a + Read,
66{
67 reader: &'a mut R,
68 inner: &'a mut Recv,
69}
70
71impl<'a, Recv, R> Iterator for DataFrameIterator<'a, Recv, R>
72where
73 Recv: 'a + Receiver,
74 R: Read,
75{
76 type Item = WebSocketResult<Recv::F>;
77
78 fn next(&mut self) -> Option<WebSocketResult<Recv::F>> {
80 Some(self.inner.recv_dataframe(self.reader))
81 }
82}
83
84pub struct MessageIterator<'a, Recv, R>
86where
87 Recv: 'a + Receiver,
88 R: 'a + Read,
89{
90 reader: &'a mut R,
91 inner: &'a mut Recv,
92}
93
94impl<'a, Recv, R> Iterator for MessageIterator<'a, Recv, R>
95where
96 Recv: 'a + Receiver,
97 R: Read,
98{
99 type Item = WebSocketResult<Recv::M>;
100
101 fn next(&mut self) -> Option<WebSocketResult<Recv::M>> {
103 Some(self.inner.recv_message(self.reader))
104 }
105}