implement tag struct for decoding tags like <world> or <saveh>
This commit is contained in:
parent
f1ee4a3d29
commit
5a3241e071
5 changed files with 44 additions and 8 deletions
|
|
@ -1,3 +1,4 @@
|
|||
mod raw;
|
||||
mod decoder;
|
||||
mod tag;
|
||||
pub mod save;
|
||||
|
|
@ -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}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)?);
|
||||
|
|
|
|||
|
|
@ -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
25
src/fot/tag.rs
Normal 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()
|
||||
])
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue