implement ReadStream
This commit is contained in:
parent
584d361095
commit
36a6140ca9
2 changed files with 45 additions and 3 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
mod raw;
|
|
||||||
mod decoder;
|
mod decoder;
|
||||||
mod tag;
|
|
||||||
mod fstring;
|
mod fstring;
|
||||||
mod world;
|
mod raw;
|
||||||
pub mod save;
|
pub mod save;
|
||||||
|
mod stream;
|
||||||
|
mod tag;
|
||||||
|
mod world;
|
||||||
|
|
|
||||||
41
src/fot/stream.rs
Normal file
41
src/fot/stream.rs
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
use super::decoder::Decoder;
|
||||||
|
use super::raw::Raw;
|
||||||
|
use anyhow::Result;
|
||||||
|
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
|
||||||
|
use std::io::Cursor;
|
||||||
|
|
||||||
|
pub struct ReadStream<'a> {
|
||||||
|
raw: &'a Raw,
|
||||||
|
rdr: Cursor<&'a [u8]>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> ReadStream<'a> {
|
||||||
|
fn new(raw: &Raw, offset: usize) -> ReadStream {
|
||||||
|
ReadStream {
|
||||||
|
raw: raw,
|
||||||
|
rdr: Cursor::new(&raw.mem[offset..]),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn offset(&self) -> usize {
|
||||||
|
self.rdr.position() as usize
|
||||||
|
}
|
||||||
|
|
||||||
|
fn skip(&mut self, size: usize) {
|
||||||
|
self.rdr.set_position(self.rdr.position() + size as u64);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read<T: Decoder>(&mut self, size: usize) -> Result<T> {
|
||||||
|
let val = T::decode(&self.raw, self.offset(), size)?;
|
||||||
|
self.skip(val.get_enc_size());
|
||||||
|
Ok(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_u16(&mut self) -> Result<u16> {
|
||||||
|
Ok(self.rdr.read_u16::<LittleEndian>()?)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_u32(&mut self) -> Result<u32> {
|
||||||
|
Ok(self.rdr.read_u32::<LittleEndian>()?)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue