Skip to content

Commit fb1c71a

Browse files
committed
removed AsyncFileReader impl for std::fs::File, added impls for tokio::fs::File
1 parent a6821e6 commit fb1c71a

File tree

3 files changed

+75
-38
lines changed

3 files changed

+75
-38
lines changed

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@ weezl = "0.1.0"
2525

2626
[dev-dependencies]
2727
tiff = "0.9.1"
28-
tokio = { version = "1.9", features = ["macros", "fs", "rt-multi-thread"] }
28+
tokio = { version = "1.9", features = ["macros", "fs", "rt-multi-thread", "io-util"] }
2929

3030
[features]
31-
default = ["object_store", "reqwest"]
31+
default = ["object_store", "reqwest", "tokio"]
32+
tokio = ["dep:tokio"]
3233
reqwest = ["dep:reqwest"]
3334
object_store = ["dep:object_store"]
3435

src/reader.rs

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Abstractions for network reading.
22
33
use std::fmt::Debug;
4-
use std::io::{Read, Seek};
4+
use std::io::Read;
55
use std::ops::Range;
66
use std::sync::Arc;
77

@@ -70,44 +70,28 @@ impl AsyncFileReader for Box<dyn AsyncFileReader + '_> {
7070
}
7171
}
7272

73-
impl AsyncFileReader for std::fs::File {
73+
#[cfg(feature = "tokio")]
74+
impl AsyncFileReader for tokio::fs::File {
7475
fn get_bytes(&self, range: Range<u64>) -> BoxFuture<'_, AsyncTiffResult<Bytes>> {
76+
use tokio::io::{AsyncReadExt, AsyncSeekExt};
77+
7578
async move {
76-
let mut file = self.try_clone()?;
77-
file.seek(std::io::SeekFrom::Start(range.start))?;
78-
let len = (range.end - range.start) as usize;
79-
let mut buf = vec![0u8; len];
80-
file.read_exact(&mut buf)?;
81-
let res = Bytes::copy_from_slice(&buf);
82-
Ok(res)
79+
let mut file = (*self).try_clone().await?;
80+
file.seek(std::io::SeekFrom::Start(range.start)).await?;
81+
82+
let to_read = (range.end - range.start).try_into().unwrap();
83+
let mut buffer = Vec::with_capacity(to_read);
84+
let read = file.take(to_read as u64).read_to_end(&mut buffer).await?;
85+
if read != to_read {
86+
return Err(AsyncTiffError::EndOfFile(to_read, read));
87+
}
88+
89+
Ok(buffer.into())
8390
}
8491
.boxed()
8592
}
8693
}
8794

88-
// #[cfg(feature = "tokio")]
89-
// impl<T: tokio::io::AsyncRead + tokio::io::AsyncSeek + Unpin + Debug + Send + Sync> AsyncFileReader
90-
// for T
91-
// {
92-
// fn get_bytes(&self, range: Range<u64>) -> BoxFuture<'_, AsyncTiffResult<Bytes>> {
93-
// use tokio::io::{AsyncReadExt, AsyncSeekExt};
94-
95-
// async move {
96-
// self.seek(std::io::SeekFrom::Start(range.start)).await?;
97-
98-
// let to_read = (range.end - range.start).try_into().unwrap();
99-
// let mut buffer = Vec::with_capacity(to_read);
100-
// let read = self.take(to_read as u64).read_to_end(&mut buffer).await?;
101-
// if read != to_read {
102-
// return Err(AsyncTiffError::EndOfFile(to_read, read));
103-
// }
104-
105-
// Ok(buffer.into())
106-
// }
107-
// .boxed()
108-
// }
109-
// }
110-
11195
/// An AsyncFileReader that reads from an [`ObjectStore`] instance.
11296
#[cfg(feature = "object_store")]
11397
#[derive(Clone, Debug)]

tests/image_tiff/util.rs

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,24 @@
1+
use async_tiff::TIFF;
2+
use std::sync::Arc;
3+
14
#[cfg(feature = "object_store")]
25
use async_tiff::reader::ObjectReader;
3-
use async_tiff::TIFF;
46
#[cfg(feature = "object_store")]
57
use object_store::local::LocalFileSystem;
68
#[cfg(feature = "object_store")]
79
use std::env::current_dir;
8-
use std::sync::Arc;
10+
11+
#[cfg(not(any(feature = "tokio", feature = "object_store")))]
12+
use async_tiff::{
13+
error::{AsyncTiffError, AsyncTiffResult},
14+
reader::AsyncFileReader,
15+
};
16+
#[cfg(not(any(feature = "tokio", feature = "object_store")))]
17+
use bytes::Bytes;
18+
#[cfg(not(any(feature = "tokio", feature = "object_store")))]
19+
use futures::{future::BoxFuture, FutureExt};
20+
#[cfg(not(any(feature = "tokio", feature = "object_store")))]
21+
use std::ops::Range;
922

1023
const TEST_IMAGE_DIR: &str = "tests/image_tiff/images/";
1124

@@ -17,10 +30,49 @@ pub(crate) async fn open_tiff(filename: &str) -> TIFF {
1730
TIFF::try_open(reader).await.unwrap()
1831
}
1932

20-
#[cfg(not(feature = "object_store"))]
33+
#[cfg(all(feature = "tokio", not(feature = "object_store")))]
2134
pub(crate) async fn open_tiff(filename: &str) -> TIFF {
2235
// let store = Arc::new(LocalFileSystem::new_with_prefix(current_dir().unwrap()).unwrap());
2336
let path = format!("{TEST_IMAGE_DIR}/{filename}");
24-
let reader = Arc::new(std::fs::File::open(path).expect("could not open file"));
37+
let reader = Arc::new(
38+
tokio::fs::File::open(path)
39+
.await
40+
.expect("could not open file"),
41+
);
42+
TIFF::try_open(reader).await.unwrap()
43+
}
44+
45+
#[cfg(not(any(feature = "tokio", feature = "object_store")))]
46+
#[derive(Debug)]
47+
struct TokioFile(tokio::fs::File);
48+
#[cfg(not(any(feature = "tokio", feature = "object_store")))]
49+
impl AsyncFileReader for TokioFile {
50+
fn get_bytes(&self, range: Range<u64>) -> BoxFuture<'_, AsyncTiffResult<Bytes>> {
51+
use tokio::io::{AsyncReadExt, AsyncSeekExt};
52+
53+
async move {
54+
let mut file = self.0.try_clone().await?;
55+
file.seek(std::io::SeekFrom::Start(range.start)).await?;
56+
57+
let to_read = (range.end - range.start).try_into().unwrap();
58+
let mut buffer = Vec::with_capacity(to_read);
59+
let read = file.take(to_read as u64).read_to_end(&mut buffer).await?;
60+
if read != to_read {
61+
return Err(AsyncTiffError::EndOfFile(to_read, read));
62+
}
63+
64+
Ok(buffer.into())
65+
}
66+
.boxed()
67+
}
68+
}
69+
#[cfg(not(any(feature = "tokio", feature = "object_store")))]
70+
pub(crate) async fn open_tiff(filename: &str) -> TIFF {
71+
let path = format!("{TEST_IMAGE_DIR}/{filename}");
72+
let reader = Arc::new(TokioFile(
73+
tokio::fs::File::open(path)
74+
.await
75+
.expect("could not open file"),
76+
));
2577
TIFF::try_open(reader).await.unwrap()
2678
}

0 commit comments

Comments
 (0)