microasync_util/io/write/
file.rs1extern crate std;
2
3use core::{
4 future::Future,
5 pin::Pin,
6 task::{Context, Poll},
7};
8use std::{
9 fs::File,
10 io::{self, Seek, SeekFrom, Write},
11};
12
13use super::{WriteExactFuture, WriteFuture};
14
15impl<'a> Future for WriteFuture<'a, File> {
16 type Output = Result<usize, io::Error>;
17
18 fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> {
19 let me = self.get_mut();
20 let r = Write::write(me.0, me.1);
21
22 match r {
23 Ok(x) => Poll::Ready(Ok(x)),
24 Err(e) => Poll::Ready(Err(e)),
25 }
26 }
27}
28
29impl<'a> Future for WriteExactFuture<'a, File> {
30 type Output = Result<(), io::Error>;
31
32 fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> {
33 fn left(f: &mut File) -> Result<u64, io::Error> {
34 let cur = f.seek(SeekFrom::Current(0))?;
35 let end = f.seek(SeekFrom::End(0))?;
36 if cur != end {
37 f.seek(SeekFrom::Start(cur))?;
38 }
39 Ok(end - cur)
40 }
41
42 let me = self.get_mut();
43 match left(me.0) {
44 Ok(left) => {
45 if left < me.1.len() as u64 {
46 return Poll::Pending;
47 }
48 }
49 Err(x) => return Poll::Ready(Err(x)),
50 }
51 let r = Write::write_all(me.0, me.1);
52
53 match r {
54 Ok(x) => Poll::Ready(Ok(x)),
55 Err(e) => Poll::Ready(Err(e)),
56 }
57 }
58}