From 4a608507129986ab6edab5fa38a4e285fd85c5ea Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Wed, 30 Aug 2023 01:36:27 +0300 Subject: [PATCH] implement WriteStream --- src/fot/stream.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/fot/stream.rs b/src/fot/stream.rs index 9336fb7..170145b 100644 --- a/src/fot/stream.rs +++ b/src/fot/stream.rs @@ -38,3 +38,46 @@ impl<'a> ReadStream<'a> { Ok(self.rdr.read_u32::()?) } } + +pub struct WriteStream { + buf: Cursor>, +} + +impl WriteStream { + pub fn new(capacity: usize) -> WriteStream { + WriteStream { + buf: Cursor::new(Vec::with_capacity(capacity)), + } + } + + pub fn into_raw(self, offset: usize, size: usize) -> Raw { + let buf_size = self.buf.get_ref().len(); + Raw { + offset: offset, + size: if size == 0 { buf_size } else { size }, + mem: self.buf.into_inner(), + } + } + + pub fn offset(&self) -> usize { + self.buf.position() as usize + } + + pub fn write_bytes(&mut self, bytes: &[u8]) { + self.buf.get_mut().extend(bytes.iter()); + } + + pub fn write(&mut self, val: &T) -> Result<()> { + let mut raw = val.encode()?; + self.buf.get_mut().append(&mut raw.mem); + Ok(()) + } + + pub fn write_u16(&mut self, val: u16) -> Result<()> { + Ok(self.buf.write_u16::(val)?) + } + + pub fn write_u32(&mut self, val: u32) -> Result<()> { + Ok(self.buf.write_u32::(val)?) + } +}