arc-reactor 0.2.4

Minimal, Asynchronous, Web Framework
Documentation
use bytes::Bytes;
use futures::prelude::*;
use tokio::{
	fs::File,
	io::{AsyncWrite, Error},
};

pub fn write(file: File, buf: Bytes) -> impl Future<Item = File, Error = Error> {
	FileWrite::new(Some(file), buf)
}

struct FileWrite {
	file: Option<File>,
	buf: Bytes,
}

impl FileWrite {
	fn new(file: Option<File>, buf: Bytes) -> Self {
		Self { file, buf }
	}
}

impl Future for FileWrite {
	type Item = File;
	type Error = Error;

	fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
		if let Some(ref mut file) = self.file {
			let _ = try_ready!(file.poll_write(&self.buf));
		}

		Ok(Async::Ready(self.file.take().unwrap()))
	}
}