1use super::{BidirectionalStream, ReceiveStream};
5
6#[derive(Debug)]
8pub enum PeerStream {
9 Bidirectional(BidirectionalStream),
10 Receive(ReceiveStream),
11}
12
13impl PeerStream {
14 pub fn id(&self) -> u64 {
36 match self {
37 Self::Bidirectional(stream) => stream.id(),
38 Self::Receive(stream) => stream.id(),
39 }
40 }
41
42 impl_connection_api!(|stream| match stream {
43 PeerStream::Bidirectional(stream) => stream.connection(),
44 PeerStream::Receive(stream) => stream.connection(),
45 });
46
47 impl_receive_stream_api!(|stream, dispatch| match stream {
48 PeerStream::Bidirectional(stream) => dispatch!(stream),
49 PeerStream::Receive(stream) => dispatch!(stream),
50 });
51
52 impl_send_stream_api!(|stream, dispatch| match stream {
53 PeerStream::Bidirectional(stream) => dispatch!(stream),
54 PeerStream::Receive(_stream) => dispatch!(),
55 });
56
57 impl_splittable_stream_api!();
58}
59
60impl_receive_stream_trait!(PeerStream, |stream, dispatch| match stream {
61 PeerStream::Bidirectional(stream) => dispatch!(stream),
62 PeerStream::Receive(stream) => dispatch!(stream),
63});
64impl_send_stream_trait!(PeerStream, |stream, dispatch| match stream {
65 PeerStream::Bidirectional(stream) => dispatch!(stream),
66 PeerStream::Receive(_stream) => dispatch!(),
67});
68impl_splittable_stream_trait!(PeerStream, |stream| match stream {
69 PeerStream::Bidirectional(stream) => super::SplittableStream::split(stream),
70 PeerStream::Receive(stream) => super::SplittableStream::split(stream),
71});
72
73impl From<ReceiveStream> for PeerStream {
74 #[inline]
75 fn from(stream: ReceiveStream) -> Self {
76 Self::Receive(stream)
77 }
78}
79
80impl From<BidirectionalStream> for PeerStream {
81 #[inline]
82 fn from(stream: BidirectionalStream) -> Self {
83 Self::Bidirectional(stream)
84 }
85}