From 5a3241e0710df79c0f5aa880a861d39365da6d6c Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Sat, 26 Aug 2023 21:20:34 +0300 Subject: [PATCH] implement tag struct for decoding tags like or --- src/fot.rs | 1 + src/fot/decoder.rs | 3 +-- src/fot/raw.rs | 17 +++++++++++++---- src/fot/save.rs | 6 ++++-- src/fot/tag.rs | 25 +++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 src/fot/tag.rs diff --git a/src/fot.rs b/src/fot.rs index cb5e58b..f0803aa 100644 --- a/src/fot.rs +++ b/src/fot.rs @@ -1,3 +1,4 @@ mod raw; mod decoder; +mod tag; pub mod save; \ No newline at end of file diff --git a/src/fot/decoder.rs b/src/fot/decoder.rs index 0e09c57..5163cd0 100644 --- a/src/fot/decoder.rs +++ b/src/fot/decoder.rs @@ -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} } diff --git a/src/fot/raw.rs b/src/fot/raw.rs index 3883623..ecf2761 100644 --- a/src/fot/raw.rs +++ b/src/fot/raw.rs @@ -15,10 +15,13 @@ pub struct Raw { } impl Raw { - pub fn load_file(path: &Path) -> Result { - 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 = 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 { @@ -37,6 +40,12 @@ impl Raw { None } + pub fn load_file(path: &Path) -> Result { + let mem = fs::read(path)?; + + Ok(Self { offset: 0, size: mem.len(), mem }) + } + pub fn assemble_file(&self, path: &Path, blocks: Vec) -> Result<()> { let mut file = BufWriter::new(OpenOptions::new() .create(true).truncate(true).write(true).open(path)?); diff --git a/src/fot/save.rs b/src/fot/save.rs index f9d7323..dcccb39 100644 --- a/src/fot/save.rs +++ b/src/fot/save.rs @@ -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(()) } diff --git a/src/fot/tag.rs b/src/fot/tag.rs new file mode 100644 index 0000000..72ba07b --- /dev/null +++ b/src/fot/tag.rs @@ -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 { + 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() + ]) + } +} \ No newline at end of file