microasync_util/io/read/
file.rs

1extern crate std;
2
3use core::{
4    future::Future,
5    pin::Pin,
6    task::{Context, Poll},
7};
8use std::{
9    fs::File,
10    io::{self, Read, Seek, SeekFrom},
11};
12
13use super::{ReadExactFuture, ReadFuture};
14
15impl<'a> Future for ReadFuture<'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 = Read::read(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 ReadExactFuture<'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 = Read::read_exact(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}