local_edf_reader/
lib.rs

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
15/**
16Init an EDFReader with the path of a local file
17*/
18pub 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
27/**
28Init an EDFReader with the path of a local file
29*/
30pub 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
37/**
38 * A FileReader for reading local files in blocking or non-blocking way
39 */
40pub struct LocalFileReader {
41    random_access_file: File,
42}
43
44impl LocalFileReader {
45    /**
46     * Init the fileReader with the path of a local file
47     */
48    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}