encode in Decoder trait now returns Result, so encoding errors will be handled

This commit is contained in:
mykola2312 2023-08-29 07:54:49 +03:00
parent 0cd80927be
commit 2ac56b9f01
5 changed files with 17 additions and 17 deletions

View file

@ -4,7 +4,7 @@ use super::raw::Raw;
pub trait Decoder: Sized { pub trait Decoder: Sized {
fn decode(raw: &Raw, offset: usize, size: usize) -> Result<Self>; fn decode(raw: &Raw, offset: usize, size: usize) -> Result<Self>;
fn encode(&self) -> Raw; fn encode(&self) -> Result<Raw>;
fn get_enc_size(&self) -> usize; fn get_enc_size(&self) -> usize;
} }
@ -17,10 +17,10 @@ impl Decoder for String {
} }
} }
fn encode(&self) -> Raw { fn encode(&self) -> Result<Raw> {
let mut str = self.as_bytes().to_vec(); let mut str = self.as_bytes().to_vec();
str.push(0); str.push(0);
Raw { offset: 0, size: str.len(), mem: str} Ok(Raw { offset: 0, size: str.len(), mem: str})
} }
fn get_enc_size(&self) -> usize { fn get_enc_size(&self) -> usize {

View file

@ -38,21 +38,21 @@ impl Decoder for FString {
} }
} }
fn encode(&self) -> Raw { fn encode(&self) -> Result<Raw> {
let mut buf = vec![0u8; 4]; let mut buf = vec![0u8; 4];
let mut wdr = Cursor::new(&mut buf[..]); let mut wdr = Cursor::new(&mut buf[..]);
if self.encoding == FStringEncoding::ANSI { if self.encoding == FStringEncoding::ANSI {
let _ = wdr.write_u32::<LittleEndian>(self.str.len() as u32 ^ (1<<31)); wdr.write_u32::<LittleEndian>(self.str.len() as u32 ^ (1<<31))?;
buf.append(&mut self.str.clone().into_bytes()); buf.append(&mut self.str.clone().into_bytes());
} else { // WCS2 } else { // WCS2
let (chars, _, _) = WINDOWS_1251.encode(self.str.as_str()); let (chars, _, _) = WINDOWS_1251.encode(self.str.as_str());
let _ = wdr.write_u32::<LittleEndian>(chars.len() as u32 | (1<<31)); wdr.write_u32::<LittleEndian>(chars.len() as u32 | (1<<31))?;
for &c in chars.iter() { for &c in chars.iter() {
buf.push(c); buf.push(c);
buf.push(0); buf.push(0);
} }
}; };
Raw { offset: 0, size: buf.len(), mem: buf } Ok(Raw { offset: 0, size: buf.len(), mem: buf })
} }
fn get_enc_size(&self) -> usize { fn get_enc_size(&self) -> usize {

View file

@ -52,7 +52,7 @@ impl Save {
pub fn save(&self, path: &Path) -> Result<()> { pub fn save(&self, path: &Path) -> Result<()> {
self.raw.assemble_file(path, vec![ self.raw.assemble_file(path, vec![
self.world.encode() self.world.encode()?
])?; ])?;
Ok(()) Ok(())

View file

@ -15,11 +15,11 @@ impl Decoder for Tag {
Ok(Tag {name, version}) Ok(Tag {name, version})
} }
fn encode(&self) -> Raw { fn encode(&self) -> Result<Raw> {
Raw::join(0, self.get_enc_size(), &mut [ Ok(Raw::join(0, self.get_enc_size(), &mut [
self.name.encode(), self.name.encode()?,
self.version.encode() self.version.encode()?
]) ]))
} }
fn get_enc_size(&self) -> usize { fn get_enc_size(&self) -> usize {

View file

@ -45,7 +45,7 @@ impl Decoder for World {
Ok(World { tag, uncompressed_size, data: Raw { offset, size, mem: data } }) Ok(World { tag, uncompressed_size, data: Raw { offset, size, mem: data } })
} }
fn encode(&self) -> Raw { fn encode(&self) -> Result<Raw> {
let mut hdr = [0u8; 8]; let mut hdr = [0u8; 8];
{ {
let mut wdr = Cursor::new(&mut hdr[..]); let mut wdr = Cursor::new(&mut hdr[..]);
@ -54,11 +54,11 @@ impl Decoder for World {
} }
let data = deflate_bytes_zlib(&self.data.mem); let data = deflate_bytes_zlib(&self.data.mem);
Raw::join(self.data.offset, self.data.size, &mut [ Ok(Raw::join(self.data.offset, self.data.size, &mut [
self.tag.encode(), self.tag.encode()?,
Raw { offset: Self::WORLD_TAG_LEN, size: 8, mem: hdr.to_vec()}, Raw { offset: Self::WORLD_TAG_LEN, size: 8, mem: hdr.to_vec()},
Raw { offset: Self::WORLD_HDR_LEN, size: data.len(), mem: data} Raw { offset: Self::WORLD_HDR_LEN, size: data.len(), mem: data}
]) ]))
} }
fn get_enc_size(&self) -> usize { fn get_enc_size(&self) -> usize {