wasi-hyperium 0.3.0

Hyperium for WASI Preview2 HTTP
Documentation
use std::{
    future::Future,
    pin::Pin,
    task::{Context, Poll},
};

use crate::Error;

pub enum Copied {
    Body(usize),
    Trailers,
}

pub trait OutgoingBodyCopier {
    fn poll_copy(&mut self, cx: &mut Context) -> Poll<Option<Result<Copied, Error>>>;

    fn copy_all(self) -> CopyAllFuture<Self>
    where
        Self: Sized + Unpin,
    {
        CopyAllFuture(self)
    }
}

pub struct CopyAllFuture<T>(T);

impl<T: OutgoingBodyCopier + Unpin> Future for CopyAllFuture<T> {
    type Output = Result<(), Error>;

    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
        loop {
            match self.0.poll_copy(cx) {
                Poll::Ready(Some(Ok(_))) => (),
                Poll::Ready(Some(Err(err))) => return Poll::Ready(Err(err)),
                Poll::Ready(None) => return Poll::Ready(Ok(())),
                Poll::Pending => return Poll::Pending,
            }
        }
    }
}