implement tag struct for decoding tags like <world> or <saveh>

This commit is contained in:
mykola2312 2023-08-26 21:20:34 +03:00
parent f1ee4a3d29
commit 5a3241e071
5 changed files with 44 additions and 8 deletions

View file

@ -1,3 +1,4 @@
mod raw;
mod decoder;
mod tag;
pub mod save;

View file

@ -1,5 +1,4 @@
use std::str;
use anyhow::anyhow;
use anyhow::Result;
use crate::fot::raw::Raw;
@ -18,7 +17,7 @@ impl Decoder for String {
}
fn encode(&self) -> Raw {
let mut str = self.clone().into_bytes();
let mut str = self.as_bytes().to_vec();
str.push(0);
Raw { offset: 0, size: str.len(), mem: str}
}

View file

@ -15,10 +15,13 @@ pub struct Raw {
}
impl Raw {
pub fn load_file(path: &Path) -> Result<Raw> {
let mem = fs::read(path)?;
Ok(Self { offset: 0, size: mem.len(), mem })
pub fn join(offset: usize, size: usize, raws: &mut [Raw], ) -> Raw {
let mut mem: Vec<u8> = Vec::new();
for raw in raws.iter_mut() {
mem.append(&mut raw.mem);
}
Raw { offset: offset, size: size, mem: mem }
}
pub fn find_str(&self, str: &str, offset: usize) -> Option<usize> {
@ -37,6 +40,12 @@ impl Raw {
None
}
pub fn load_file(path: &Path) -> Result<Raw> {
let mem = fs::read(path)?;
Ok(Self { offset: 0, size: mem.len(), mem })
}
pub fn assemble_file(&self, path: &Path, blocks: Vec<Raw>) -> Result<()> {
let mut file = BufWriter::new(OpenOptions::new()
.create(true).truncate(true).write(true).open(path)?);

View file

@ -10,6 +10,7 @@ use deflate::deflate_bytes_zlib;
use crate::fot::decoder::Decoder;
use crate::fot::raw::Raw;
use crate::fot::decoder;
use crate::fot::tag::Tag;
#[derive(Debug)]
pub struct World {
@ -102,8 +103,9 @@ impl Save {
}
pub fn test(&self) -> Result<()> {
let a = "hello".to_string().encode();
dbg!(a);
let raw = Raw { offset: 0, size: self.raw.len(), mem: self.raw.clone() };
let tag = Tag::decode(&raw, 0x99A84, 7);
dbg!(&tag);
Ok(())
}

25
src/fot/tag.rs Normal file
View file

@ -0,0 +1,25 @@
use anyhow::Result;
use crate::fot::raw::Raw;
use crate::fot::decoder::Decoder;
#[derive(Debug)]
pub struct Tag {
pub name: String,
pub version: String
}
impl Decoder for Tag {
fn decode(raw: &Raw, offset: usize, size: usize) -> Result<Self> {
let name = String::decode(raw, offset, size)?;
let version = String::decode(raw, offset + name.len()+1, 0)?;
Ok(Tag {name, version})
}
fn encode(&self) -> Raw {
let len = self.name.len() + 1 + self.version.len() + 1;
Raw::join(0, len, &mut [
self.name.encode(),
self.version.encode()
])
}
}