review_protocol/
frame.rs

1use std::io;
2
3use oinq::frame;
4use quinn::{RecvStream, SendStream};
5use serde::{Serialize, de::DeserializeOwned};
6
7/// Receives a message as a stream.
8///
9/// # Errors
10///
11/// Returns an error if receiving the message failed.
12pub async fn recv_msg<T>(recv: &mut RecvStream) -> io::Result<T>
13where
14    T: DeserializeOwned,
15{
16    let mut buf = Vec::new();
17    frame::recv(recv, &mut buf).await
18}
19
20/// Sends a message as a stream.
21///
22/// # Errors
23///
24/// Return an error if sending the message failed.
25pub async fn send_msg<T>(send: &mut SendStream, msg: T) -> io::Result<()>
26where
27    T: Serialize,
28{
29    let mut buf = Vec::new();
30    frame::send(send, &mut buf, msg).await
31}
32
33#[cfg(test)]
34mod tests {
35
36    #[tokio::test]
37    async fn send_and_recv() {
38        use serde::{Deserialize, Serialize};
39
40        use crate::test::{TOKEN, channel};
41
42        #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
43        struct Msg {
44            string: String,
45            integer: i32,
46            floating_point: f32,
47        }
48
49        let _lock = TOKEN.lock().await;
50        let mut channel = channel().await;
51
52        let msg_one = Msg {
53            string: "hello".to_string(),
54            integer: 10,
55            floating_point: 10.0,
56        };
57
58        super::send_msg(&mut channel.server.send, msg_one.clone())
59            .await
60            .unwrap();
61        let received = super::recv_msg::<Msg>(&mut channel.client.recv)
62            .await
63            .unwrap();
64        assert_eq!(received, msg_one);
65
66        let msg_two = Msg {
67            string: "world".to_string(),
68            integer: 20,
69            floating_point: 20.0,
70        };
71
72        super::send_msg(&mut channel.server.send, msg_two.clone())
73            .await
74            .unwrap();
75        let received = super::recv_msg::<Msg>(&mut channel.client.recv)
76            .await
77            .unwrap();
78        assert_eq!(received, msg_two);
79    }
80}