tokio_fs/file/
metadata.rs

1use super::File;
2
3use futures::{Future, Poll};
4
5use std::fs::File as StdFile;
6use std::fs::Metadata;
7use std::io;
8
9const POLL_AFTER_RESOLVE: &str = "Cannot poll MetadataFuture after it resolves";
10
11/// Future returned by `File::metadata` and resolves to a `(File, Metadata)` instance.
12#[derive(Debug)]
13pub struct MetadataFuture {
14    file: Option<File>,
15}
16
17impl MetadataFuture {
18    pub(crate) fn new(file: File) -> Self {
19        MetadataFuture { file: Some(file) }
20    }
21
22    fn std(&mut self) -> &mut StdFile {
23        self.file.as_mut().expect(POLL_AFTER_RESOLVE).std()
24    }
25}
26
27impl Future for MetadataFuture {
28    type Item = (File, Metadata);
29    type Error = io::Error;
30
31    fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
32        let metadata = try_ready!(::blocking_io(|| StdFile::metadata(self.std())));
33
34        let file = self.file.take().expect(POLL_AFTER_RESOLVE);
35        Ok((file, metadata).into())
36    }
37}