async_compression/futures/write/macros/
encoder.rs1macro_rules! encoder {
2 ($(#[$attr:meta])* $name:ident<$inner:ident> $({ $($inherent_methods:tt)* })*) => {
3 pin_project_lite::pin_project! {
4 $(#[$attr])*
5 #[derive(Debug)]
9 pub struct $name<$inner> {
10 #[pin]
11 inner: crate::futures::write::Encoder<$inner, crate::codecs::$name>,
12 }
13 }
14
15 impl<$inner: futures_io::AsyncWrite> $name<$inner> {
16 $(
17 $($inherent_methods)*
21 )*
22
23 pub fn with_codec(read: $inner, codec: crate::codecs::$name) -> $name<$inner> {
26 $name {
27 inner: crate::futures::write::Encoder::new(read, codec)
28 }
29 }
30 }
31
32 impl<$inner> $name<$inner> {
33 pub fn get_ref(&self) -> &$inner {
35 self.inner.get_ref()
36 }
37
38 pub fn get_mut(&mut self) -> &mut $inner {
44 self.inner.get_mut()
45 }
46
47 pub fn get_pin_mut(self: std::pin::Pin<&mut Self>) -> std::pin::Pin<&mut $inner> {
53 self.project().inner.get_pin_mut()
54 }
55
56 pub fn into_inner(self) -> $inner {
61 self.inner.into_inner()
62 }
63 }
64
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
89 impl<$inner: futures_io::AsyncRead> futures_io::AsyncRead for $name<$inner> {
90 fn poll_read(
91 self: std::pin::Pin<&mut Self>,
92 cx: &mut std::task::Context<'_>,
93 buf: &mut [u8]
94 ) -> std::task::Poll<std::io::Result<usize>> {
95 self.get_pin_mut().poll_read(cx, buf)
96 }
97
98 fn poll_read_vectored(
99 self: std::pin::Pin<&mut Self>,
100 cx: &mut std::task::Context<'_>,
101 bufs: &mut [futures_io::IoSliceMut<'_>]
102 ) -> std::task::Poll<std::io::Result<usize>> {
103 self.get_pin_mut().poll_read_vectored(cx, bufs)
104 }
105 }
106
107 impl<$inner: futures_io::AsyncBufRead> futures_io::AsyncBufRead for $name<$inner> {
108 fn poll_fill_buf(
109 self: std::pin::Pin<&mut Self>,
110 cx: &mut std::task::Context<'_>
111 ) -> std::task::Poll<std::io::Result<&[u8]>> {
112 self.get_pin_mut().poll_fill_buf(cx)
113 }
114
115 fn consume(self: std::pin::Pin<&mut Self>, amt: usize) {
116 self.get_pin_mut().consume(amt)
117 }
118 }
119
120 const _: () = {
121 use crate::core::util::{_assert_send, _assert_sync};
122 use core::pin::Pin;
123 use futures_io::AsyncWrite;
124
125 _assert_send::<$name<Pin<Box<dyn AsyncWrite + Send>>>>();
126 _assert_sync::<$name<Pin<Box<dyn AsyncWrite + Sync>>>>();
127 };
128 }
129}