discombobulate/
lib.rs

1use std::path::Path;
2use std::fs::File;
3use std::io::{Read, self};
4
5// Use 1MB buffer for reads
6const CHUNK_SIZE: usize = 1024 *1024;
7
8#[non_exhaustive]
9pub struct Metadata{
10
11}
12
13pub struct ChunkIter{
14    f: File,
15    chunk_len: u64,
16    buffer: [u8; CHUNK_SIZE],
17}
18
19impl ChunkIter{
20    pub fn new(f: File, len: u64) -> Self{
21        ChunkIter{f: f, chunk_len: len, buffer: [0;CHUNK_SIZE]}
22    }
23}
24
25impl Iterator for ChunkIter{
26    type Item = Result<Vec<u8>, io::Error>;
27    fn next(&mut self) -> Option<Result<Vec<u8>, io::Error>>{
28        match self.f.by_ref()
29            .take(self.chunk_len)
30            .read(&mut self.buffer){
31            Ok(i) => {
32                if i == 0 {
33                    return None
34                } else {
35                    Some(Ok(self.buffer[..i].to_vec()))}
36                },
37            Err(e) => Some(Err(e))
38        }
39    }
40}
41
42pub fn discombobulate<F: AsRef<Path>>(file: F, chunk_len: u64) -> Result<Box<dyn Iterator<Item = Result<Vec<u8>, io::Error>>>, io::Error>{
43    match File::open(file){
44        Err(e) => {return Err(e)}
45        Ok(mut f) => {
46            return Ok(Box::new(ChunkIter::new(f, chunk_len)))
47        }
48    }
49}