Skip to content

Commit 5f51d42

Browse files
authored
Merge pull request #297 from link2xt/link2xt/passthrough-traits
Pass through `AsyncRead` and `AsyncWrite` traits
2 parents 8c5b88a + a3d5d67 commit 5f51d42

File tree

18 files changed

+490
-104
lines changed

18 files changed

+490
-104
lines changed

src/futures/bufread/generic/decoder.rs

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ use core::{
22
pin::Pin,
33
task::{Context, Poll},
44
};
5-
use std::io::Result;
5+
use std::io::{IoSlice, Result};
66

77
use crate::{codec::Decode, util::PartialBuffer};
88
use futures_core::ready;
9-
use futures_io::{AsyncBufRead, AsyncRead};
9+
use futures_io::{AsyncBufRead, AsyncRead, AsyncWrite};
1010
use pin_project_lite::pin_project;
1111

1212
#[derive(Debug)]
@@ -19,7 +19,7 @@ enum State {
1919

2020
pin_project! {
2121
#[derive(Debug)]
22-
pub struct Decoder<R, D: Decode> {
22+
pub struct Decoder<R, D> {
2323
#[pin]
2424
reader: R,
2525
decoder: D,
@@ -28,16 +28,7 @@ pin_project! {
2828
}
2929
}
3030

31-
impl<R: AsyncBufRead, D: Decode> Decoder<R, D> {
32-
pub fn new(reader: R, decoder: D) -> Self {
33-
Self {
34-
reader,
35-
decoder,
36-
state: State::Decoding,
37-
multiple_members: false,
38-
}
39-
}
40-
31+
impl<R, D> Decoder<R, D> {
4132
pub fn get_ref(&self) -> &R {
4233
&self.reader
4334
}
@@ -57,6 +48,17 @@ impl<R: AsyncBufRead, D: Decode> Decoder<R, D> {
5748
pub fn multiple_members(&mut self, enabled: bool) {
5849
self.multiple_members = enabled;
5950
}
51+
}
52+
53+
impl<R: AsyncBufRead, D: Decode> Decoder<R, D> {
54+
pub fn new(reader: R, decoder: D) -> Self {
55+
Self {
56+
reader,
57+
decoder,
58+
state: State::Decoding,
59+
multiple_members: false,
60+
}
61+
}
6062

6163
fn do_poll_read(
6264
self: Pin<&mut Self>,
@@ -158,3 +160,25 @@ impl<R: AsyncBufRead, D: Decode> AsyncRead for Decoder<R, D> {
158160
}
159161
}
160162
}
163+
164+
impl<R: AsyncWrite, D> AsyncWrite for Decoder<R, D> {
165+
fn poll_write(self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8]) -> Poll<Result<usize>> {
166+
self.get_pin_mut().poll_write(cx, buf)
167+
}
168+
169+
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
170+
self.get_pin_mut().poll_flush(cx)
171+
}
172+
173+
fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
174+
self.get_pin_mut().poll_close(cx)
175+
}
176+
177+
fn poll_write_vectored(
178+
self: Pin<&mut Self>,
179+
cx: &mut Context<'_>,
180+
bufs: &[IoSlice<'_>],
181+
) -> Poll<Result<usize>> {
182+
self.get_pin_mut().poll_write_vectored(cx, bufs)
183+
}
184+
}

src/futures/bufread/generic/encoder.rs

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::io::Result;
66

77
use crate::{codec::Encode, util::PartialBuffer};
88
use futures_core::ready;
9-
use futures_io::{AsyncBufRead, AsyncRead};
9+
use futures_io::{AsyncBufRead, AsyncRead, AsyncWrite, IoSlice};
1010
use pin_project_lite::pin_project;
1111

1212
#[derive(Debug)]
@@ -18,23 +18,15 @@ enum State {
1818

1919
pin_project! {
2020
#[derive(Debug)]
21-
pub struct Encoder<R, E: Encode> {
21+
pub struct Encoder<R, E> {
2222
#[pin]
2323
reader: R,
2424
encoder: E,
2525
state: State,
2626
}
2727
}
2828

29-
impl<R: AsyncBufRead, E: Encode> Encoder<R, E> {
30-
pub fn new(reader: R, encoder: E) -> Self {
31-
Self {
32-
reader,
33-
encoder,
34-
state: State::Encoding,
35-
}
36-
}
37-
29+
impl<R, E> Encoder<R, E> {
3830
pub fn get_ref(&self) -> &R {
3931
&self.reader
4032
}
@@ -54,6 +46,16 @@ impl<R: AsyncBufRead, E: Encode> Encoder<R, E> {
5446
pub fn into_inner(self) -> R {
5547
self.reader
5648
}
49+
}
50+
51+
impl<R: AsyncBufRead, E: Encode> Encoder<R, E> {
52+
pub fn new(reader: R, encoder: E) -> Self {
53+
Self {
54+
reader,
55+
encoder,
56+
state: State::Encoding,
57+
}
58+
}
5759

5860
fn do_poll_read(
5961
self: Pin<&mut Self>,
@@ -115,3 +117,25 @@ impl<R: AsyncBufRead, E: Encode> AsyncRead for Encoder<R, E> {
115117
}
116118
}
117119
}
120+
121+
impl<R: AsyncWrite, E> AsyncWrite for Encoder<R, E> {
122+
fn poll_write(self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8]) -> Poll<Result<usize>> {
123+
self.get_pin_mut().poll_write(cx, buf)
124+
}
125+
126+
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
127+
self.get_pin_mut().poll_flush(cx)
128+
}
129+
130+
fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>> {
131+
self.get_pin_mut().poll_close(cx)
132+
}
133+
134+
fn poll_write_vectored(
135+
self: Pin<&mut Self>,
136+
cx: &mut Context<'_>,
137+
bufs: &[IoSlice<'_>],
138+
) -> Poll<Result<usize>> {
139+
self.get_pin_mut().poll_write_vectored(cx, bufs)
140+
}
141+
}

src/futures/bufread/macros/decoder.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ macro_rules! decoder {
2222
}
2323

2424
$($($inherent_methods)*)*
25+
}
2526

27+
impl<$inner> $name<$inner> {
2628
/// Configure multi-member/frame decoding, if enabled this will reset the decoder state
2729
/// when reaching the end of a compressed member/frame and expect either EOF or another
2830
/// compressed member/frame to follow it in the stream.
@@ -72,6 +74,38 @@ macro_rules! decoder {
7274
}
7375
}
7476

77+
impl<$inner: futures_io::AsyncWrite> futures_io::AsyncWrite for $name<$inner> {
78+
fn poll_write(
79+
self: std::pin::Pin<&mut Self>,
80+
cx: &mut std::task::Context<'_>,
81+
buf: &[u8],
82+
) -> std::task::Poll<std::io::Result<usize>> {
83+
self.get_pin_mut().poll_write(cx, buf)
84+
}
85+
86+
fn poll_flush(
87+
self: std::pin::Pin<&mut Self>,
88+
cx: &mut std::task::Context<'_>,
89+
) -> std::task::Poll<std::io::Result<()>> {
90+
self.get_pin_mut().poll_flush(cx)
91+
}
92+
93+
fn poll_close(
94+
self: std::pin::Pin<&mut Self>,
95+
cx: &mut std::task::Context<'_>,
96+
) -> std::task::Poll<std::io::Result<()>> {
97+
self.get_pin_mut().poll_close(cx)
98+
}
99+
100+
fn poll_write_vectored(
101+
self: std::pin::Pin<&mut Self>,
102+
cx: &mut std::task::Context<'_>,
103+
bufs: &[std::io::IoSlice<'_>]
104+
) -> std::task::Poll<std::io::Result<usize>> {
105+
self.get_pin_mut().poll_write_vectored(cx, bufs)
106+
}
107+
}
108+
75109
const _: () = {
76110
fn _assert() {
77111
use crate::util::{_assert_send, _assert_sync};

src/futures/bufread/macros/encoder.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,38 @@ macro_rules! encoder {
6262
}
6363
}
6464

65+
impl<$inner: futures_io::AsyncWrite> futures_io::AsyncWrite for $name<$inner> {
66+
fn poll_write(
67+
self: std::pin::Pin<&mut Self>,
68+
cx: &mut std::task::Context<'_>,
69+
buf: &[u8],
70+
) -> std::task::Poll<std::io::Result<usize>> {
71+
self.project().inner.poll_write(cx, buf)
72+
}
73+
74+
fn poll_flush(
75+
self: std::pin::Pin<&mut Self>,
76+
cx: &mut std::task::Context<'_>,
77+
) -> std::task::Poll<std::io::Result<()>> {
78+
self.project().inner.poll_flush(cx)
79+
}
80+
81+
fn poll_close(
82+
self: std::pin::Pin<&mut Self>,
83+
cx: &mut std::task::Context<'_>,
84+
) -> std::task::Poll<std::io::Result<()>> {
85+
self.project().inner.poll_close(cx)
86+
}
87+
88+
fn poll_write_vectored(
89+
self: std::pin::Pin<&mut Self>,
90+
cx: &mut std::task::Context<'_>,
91+
bufs: &[std::io::IoSlice<'_>]
92+
) -> std::task::Poll<std::io::Result<usize>> {
93+
self.project().inner.poll_write_vectored(cx, bufs)
94+
}
95+
}
96+
6597
const _: () = {
6698
fn _assert() {
6799
use crate::util::{_assert_send, _assert_sync};

src/futures/write/buf_writer.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ impl<W: AsyncWrite> BufWriter<W> {
113113
*this.written = 0;
114114
Poll::Ready(ret)
115115
}
116+
}
116117

118+
impl<W> BufWriter<W> {
117119
/// Gets a reference to the underlying writer.
118120
pub fn get_ref(&self) -> &W {
119121
&self.inner

src/futures/write/generic/decoder.rs

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::{
1010
util::PartialBuffer,
1111
};
1212
use futures_core::ready;
13-
use futures_io::AsyncWrite;
13+
use futures_io::{AsyncRead, AsyncWrite, IoSliceMut};
1414
use pin_project_lite::pin_project;
1515

1616
#[derive(Debug)]
@@ -22,23 +22,15 @@ enum State {
2222

2323
pin_project! {
2424
#[derive(Debug)]
25-
pub struct Decoder<W, D: Decode> {
25+
pub struct Decoder<W, D> {
2626
#[pin]
2727
writer: BufWriter<W>,
2828
decoder: D,
2929
state: State,
3030
}
3131
}
3232

33-
impl<W: AsyncWrite, D: Decode> Decoder<W, D> {
34-
pub fn new(writer: W, decoder: D) -> Self {
35-
Self {
36-
writer: BufWriter::new(writer),
37-
decoder,
38-
state: State::Decoding,
39-
}
40-
}
41-
33+
impl<W, D> Decoder<W, D> {
4234
pub fn get_ref(&self) -> &W {
4335
self.writer.get_ref()
4436
}
@@ -54,6 +46,16 @@ impl<W: AsyncWrite, D: Decode> Decoder<W, D> {
5446
pub fn into_inner(self) -> W {
5547
self.writer.into_inner()
5648
}
49+
}
50+
51+
impl<W: AsyncWrite, D: Decode> Decoder<W, D> {
52+
pub fn new(writer: W, decoder: D) -> Self {
53+
Self {
54+
writer: BufWriter::new(writer),
55+
decoder,
56+
state: State::Decoding,
57+
}
58+
}
5759

5860
fn do_poll_write(
5961
self: Pin<&mut Self>,
@@ -182,3 +184,21 @@ impl<W: AsyncWrite, D: Decode> AsyncWrite for Decoder<W, D> {
182184
}
183185
}
184186
}
187+
188+
impl<W: AsyncRead, D> AsyncRead for Decoder<W, D> {
189+
fn poll_read(
190+
self: Pin<&mut Self>,
191+
cx: &mut Context<'_>,
192+
buf: &mut [u8],
193+
) -> Poll<io::Result<usize>> {
194+
self.get_pin_mut().poll_read(cx, buf)
195+
}
196+
197+
fn poll_read_vectored(
198+
self: Pin<&mut Self>,
199+
cx: &mut Context<'_>,
200+
bufs: &mut [IoSliceMut<'_>],
201+
) -> Poll<io::Result<usize>> {
202+
self.get_pin_mut().poll_read_vectored(cx, bufs)
203+
}
204+
}

0 commit comments

Comments
 (0)