1use std::io;
2
3use oinq::frame;
4use quinn::{RecvStream, SendStream};
5use serde::{Serialize, de::DeserializeOwned};
6
7pub 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
20pub 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}