From 36a6140ca9b9b304587a1fe96270df395027d4b8 Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Tue, 29 Aug 2023 23:08:04 +0300 Subject: [PATCH] implement ReadStream --- src/fot.rs | 7 ++++--- src/fot/stream.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 src/fot/stream.rs diff --git a/src/fot.rs b/src/fot.rs index 8ae5475..60cdb9a 100644 --- a/src/fot.rs +++ b/src/fot.rs @@ -1,6 +1,7 @@ -mod raw; mod decoder; -mod tag; mod fstring; +mod raw; +pub mod save; +mod stream; +mod tag; mod world; -pub mod save; \ No newline at end of file diff --git a/src/fot/stream.rs b/src/fot/stream.rs new file mode 100644 index 0000000..91aecba --- /dev/null +++ b/src/fot/stream.rs @@ -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(&mut self, size: usize) -> Result { + let val = T::decode(&self.raw, self.offset(), size)?; + self.skip(val.get_enc_size()); + Ok(val) + } + + fn read_u16(&mut self) -> Result { + Ok(self.rdr.read_u16::()?) + } + + fn read_u32(&mut self) -> Result { + Ok(self.rdr.read_u32::()?) + } +}