1use tokio::io::{AsyncRead, AsyncWrite};
2
3mod read;
4#[doc(inline)]
5pub use read::{ChainReader, HeapReader, StackReader, discard};
6
7mod prefix;
8#[doc(inline)]
9pub use prefix::PrefixedIo;
10
11mod graceful;
12pub use graceful::{CancelIo, GracefulIo};
13
14pub mod peek;
15pub mod rewind;
16pub mod timeout;
17
18mod bridge;
19pub use bridge::BridgeIo;
20
21mod owned;
22#[doc(inline)]
23pub use owned::{
24 ArrayBuf, AsyncReadOwned, AsyncWriteOwned, BufResult, BufSlot, IoBuf, IoBufMut, SetLen, Slice,
25 SplitIo, Uninit,
26};
27
28pub trait Io: AsyncRead + AsyncWrite + Send + 'static {}
31
32impl<T> Io for T where T: AsyncRead + AsyncWrite + Send + 'static {}
33
34pub trait PeekIoProvider: Send + 'static {
41 type PeekIo: Io;
43
44 type Mapped<PeekedIo: Io>: Send + 'static;
47
48 fn peek_io_mut(&mut self) -> &mut Self::PeekIo;
50
51 fn map_peek_io<PeekedIo, F>(self, map: F) -> Self::Mapped<PeekedIo>
55 where
56 PeekedIo: Io,
57 F: FnOnce(Self::PeekIo) -> PeekedIo;
58}
59
60impl<T: Io> PeekIoProvider for T {
61 type PeekIo = T;
62 type Mapped<PeekedIo: Io> = PeekedIo;
63
64 #[inline(always)]
65 fn peek_io_mut(&mut self) -> &mut Self::PeekIo {
66 self
67 }
68
69 #[inline(always)]
70 fn map_peek_io<PeekedIo, F>(self, map: F) -> Self::Mapped<PeekedIo>
71 where
72 PeekedIo: Io,
73 F: FnOnce(Self::PeekIo) -> PeekedIo,
74 {
75 map(self)
76 }
77}