1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use super::file::*;
use super::parser;
use assembly_core::reader::{FileError, FileResult};
use std::io::prelude::*;
use std::io::SeekFrom;
pub struct LevelReader<T> {
inner: T,
}
impl<T> LevelReader<T> {
pub fn new(inner: T) -> Self {
Self{inner}
}
}
impl<T> LevelReader<T>
where T: Read + Seek {
pub fn get_chunk_header(&mut self) -> FileResult<ChunkHeader> {
let mut header_bytes = [0 as u8; 20];
self.inner.read_exact(&mut header_bytes).map_err(FileError::Read)?;
let (_rest, header) = parser::parse_chunk_header(&mut header_bytes)?;
Ok(header)
}
pub fn get_meta_chunk_data(&mut self) -> FileResult<FileMetaChunkData> {
let mut meta_chunk_data_bytes = [0 as u8; 20];
self.inner.read_exact(&mut meta_chunk_data_bytes).map_err(FileError::Read)?;
let (_rest, meta_chunk_data) = parser::parse_file_meta_chunk_data(&mut meta_chunk_data_bytes)?;
Ok(meta_chunk_data)
}
pub fn get_meta_chunk(&mut self) -> FileResult<FileMetaChunk> {
let header = self.get_chunk_header()?;
self.inner.seek(SeekFrom::Start(header.offset.into())).map_err(FileError::Seek)?;
let data = self.get_meta_chunk_data()?;
Ok(FileMetaChunk{header, data})
}
}