moq_lite/coding/
stream.rs

1use 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}