fn poll_read_vectored(
            self: Pin<&mut Self>,
            cx: &mut Context<'_>,
            bufs: &mut [IoSliceMut<'_>],
        ) -> Poll<Result<usize>> {
            for b in bufs {
                if !b.is_empty() {
                    return self.poll_read(cx, b);
                }
            }

            self.poll_read(cx, &mut [])
        }
Attempt to read from the `AsyncRead` into `bufs` using vectored
IO operations.

This method is similar to `poll_read`, but allows data to be read
into multiple buffers using a single operation.

On success, returns `Poll::Ready(Ok(num_bytes_read))`.

If no data is available for reading, the method returns
`Poll::Pending` and arranges for the current task (via
`cx.waker().wake_by_ref()`) to receive a notification when the object becomes
readable or is closed.
By default, this method delegates to using `poll_read` on the first
nonempty buffer in `bufs`, or an empty one if none exists. Objects which
support vectored IO should override this method.

# Implementation

This function may not return errors of kind `WouldBlock` or
`Interrupted`.  Implementations must convert `WouldBlock` into
`Poll::Pending` and either internally retry or convert
`Interrupted` into another error kind.
futures-io/src/lib.rs