// use futures::{Stream, AsyncRead, TryStream};
use std::task::{Context, Poll};
use std::pin::Pin;
use actix_web::web::Bytes;
use std::io::Error;

pub struct ToStream<T>(pub T);

impl<T> ToStream<T> {
    fn get_field(self: Pin<&mut Self>) -> Pin<&mut T> {
        unsafe { self.map_unchecked_mut(|s| &mut s.0) }
    }
}

impl <T : Unpin> Unpin for ToStream<T>{}

impl <T : tokio::io::AsyncRead> futures::Stream for ToStream<T>{
    type Item = Result<Bytes, Error>;

    fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
        let mut buff: [u8; 1024] = [0; 1024];
        let mut t = self.get_field();
        t.poll_read(cx, &mut buff[..]).map_ok(|l| {Bytes::copy_from_slice(&buff[0..l])}).map(|res| Some(res))
    }
}