moq_lite/coding/
stream.rs1use std::sync::Arc;
2
3use crate::coding::{Reader, Writer};
4use crate::Error;
5
6pub struct Stream<S: web_transport_trait::Session, V> {
7 pub writer: Writer<S::SendStream, V>,
8 pub reader: Reader<S::RecvStream, V>,
9}
10
11impl<S: web_transport_trait::Session, V> Stream<S, V> {
12 pub async fn open(session: &S, version: V) -> Result<Self, Error>
13 where
14 V: Clone,
15 {
16 let (send, recv) = session.open_bi().await.map_err(|err| Error::Transport(Arc::new(err)))?;
17
18 let writer = Writer::new(send, version.clone());
19 let reader = Reader::new(recv, version);
20
21 Ok(Stream { writer, reader })
22 }
23
24 pub async fn accept(session: &S, version: V) -> Result<Self, Error>
25 where
26 V: Clone,
27 {
28 let (send, recv) = session
29 .accept_bi()
30 .await
31 .map_err(|err| Error::Transport(Arc::new(err)))?;
32
33 let writer = Writer::new(send, version.clone());
34 let reader = Reader::new(recv, version);
35
36 Ok(Stream { writer, reader })
37 }
38
39 pub fn with_version<O: Clone>(self, version: O) -> Stream<S, O> {
40 Stream {
41 writer: self.writer.with_version(version.clone()),
42 reader: self.reader.with_version(version),
43 }
44 }
45}