websocket_base/ws/
receiver.rs

1//! Provides a trait for receiving data frames and messages.
2//!
3//! Also provides iterators over data frames and messages.
4//! See the `ws` module documentation for more information.
5
6use crate::result::WebSocketResult;
7use crate::ws::dataframe::DataFrame;
8use crate::ws::Message;
9use std::io::Read;
10
11/// A trait for receiving data frames and messages.
12pub trait Receiver: Sized {
13	/// The type of dataframe that incoming messages will be serialized to.
14	type F: DataFrame;
15
16	/// The type of message that incoming messages will be serialized to.
17	type M: Message;
18
19	/// Reads a single data frame from this receiver.
20	fn recv_dataframe<R>(&mut self, reader: &mut R) -> WebSocketResult<Self::F>
21	where
22		R: Read;
23
24	/// Returns the data frames that constitute one message.
25	fn recv_message_dataframes<R>(&mut self, reader: &mut R) -> WebSocketResult<Vec<Self::F>>
26	where
27		R: Read;
28
29	/// Returns an iterator over incoming data frames.
30	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	/// Reads a single message from this receiver.
41	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	/// Returns an iterator over incoming messages.
50	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
61/// An iterator over data frames from a Receiver.
62pub 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	/// Get the next data frame from the receiver. Always returns `Some`.
79	fn next(&mut self) -> Option<WebSocketResult<Recv::F>> {
80		Some(self.inner.recv_dataframe(self.reader))
81	}
82}
83
84/// An iterator over messages from a Receiver.
85pub 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	/// Get the next message from the receiver. Always returns `Some`.
102	fn next(&mut self) -> Option<WebSocketResult<Recv::M>> {
103		Some(self.inner.recv_message(self.reader))
104	}
105}