1extern crate edf_reader;
2extern crate futures;
3use positioned_io::ReadAt;
4
5
6use edf_reader::async_reader::*;
7use edf_reader::file_reader::*;
8use edf_reader::sync_reader::*;
9
10use futures::future::{err, ok};
11use futures::Future;
12use std::fs::File;
13use std::path::Path;
14
15pub fn init_async_reader<P: AsRef<Path>>(
19 file_path: P,
20) -> Box<Future<Item = AsyncEDFReader<LocalFileReader>, Error = std::io::Error>> {
21 match LocalFileReader::init(file_path) {
22 Ok(file_reader) => Box::new(AsyncEDFReader::init_with_file_reader(file_reader)),
23 Err(e) => Box::new(err::<AsyncEDFReader<LocalFileReader>, std::io::Error>(e)),
24 }
25}
26
27pub fn init_sync_reader<P: AsRef<Path>>(
31 file_path: P,
32) -> Result<SyncEDFReader<LocalFileReader>, std::io::Error> {
33 let file_reader = LocalFileReader::init(file_path)?;
34 SyncEDFReader::init_with_file_reader(file_reader)
35}
36
37pub struct LocalFileReader {
41 random_access_file: File,
42}
43
44impl LocalFileReader {
45 pub fn init<P: AsRef<Path>>(file_path: P) -> Result<LocalFileReader, std::io::Error> {
49 let file = File::open(file_path)?;
50 Ok(LocalFileReader {
51 random_access_file: file,
52 })
53 }
54}
55
56impl SyncFileReader for LocalFileReader {
57 fn read(&self, offset: u64, length: u64) -> Result<Vec<u8>, std::io::Error> {
58 let mut data = vec![0; length as usize];
59
60 self.random_access_file.read_at(offset, &mut data[..])?;
61
62 Ok(data)
63 }
64}
65
66impl AsyncFileReader for LocalFileReader {
67 fn read_async(
68 &self,
69 offset: u64,
70 length: u64,
71 ) -> Box<Future<Item = Vec<u8>, Error = std::io::Error> + Send> {
72 match self.read(offset, length) {
73 Ok(data) => Box::new(ok::<Vec<u8>, std::io::Error>(data)),
74 Err(e) => Box::new(err::<Vec<u8>, std::io::Error>(e)),
75 }
76 }
77}