use crate::io::AsyncWrite; use std::future::Future; use std::io; use std::pin::Pin; use std::task::{Context, Poll}; cfg_io_util! { /// A future used to shutdown an I/O object. /// /// Created by the [`AsyncWriteExt::shutdown`] function. #[derive(Debug)] pub struct Shutdown<'a, A: ?Sized> { a: &'a mut A, } } /// Creates a future which will shutdown an I/O object. pub(super) fn shutdown(a: &mut A) -> Shutdown<'_, A> where A: AsyncWrite + Unpin + ?Sized, { Shutdown { a } } impl Future for Shutdown<'_, A> where A: AsyncWrite + Unpin + ?Sized, { type Output = io::Result<()>; fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let me = &mut *self; Pin::new(&mut *me.a).poll_shutdown(cx) } } #[cfg(test)] mod tests { use super::*; #[test] fn assert_unpin() { use std::marker::PhantomPinned; crate::is_unpin::>(); } }