1use std::path::Path;
2use std::fs::File;
3use std::io::{Read, self};
4
5const 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}