diff --git a/src/fot.rs b/src/fot.rs index 8e7a391..cb5e58b 100644 --- a/src/fot.rs +++ b/src/fot.rs @@ -1,2 +1,3 @@ mod raw; +mod decoder; pub mod save; \ No newline at end of file diff --git a/src/fot/decoder.rs b/src/fot/decoder.rs new file mode 100644 index 0000000..0e09c57 --- /dev/null +++ b/src/fot/decoder.rs @@ -0,0 +1,25 @@ +use std::str; +use anyhow::anyhow; +use anyhow::Result; +use crate::fot::raw::Raw; + +pub trait Decoder: Sized { + fn decode(raw: &Raw, offset: usize, size: usize) -> Result; + fn encode(&self) -> Raw; +} + +impl Decoder for String { + fn decode(raw: &Raw, offset: usize, size: usize) -> Result { + let str = &raw.mem[offset..]; + match str.iter().position(|&c| c == 0) { + Some(pos) => Ok(str::from_utf8(&str[..pos])?.to_string()), + None => Ok(str::from_utf8(&raw.mem[offset..offset+size])?.to_string()) + } + } + + fn encode(&self) -> Raw { + let mut str = self.clone().into_bytes(); + str.push(0); + Raw { offset: 0, size: str.len(), mem: str} + } +} \ No newline at end of file diff --git a/src/fot/raw.rs b/src/fot/raw.rs index d6cadc2..3883623 100644 --- a/src/fot/raw.rs +++ b/src/fot/raw.rs @@ -7,6 +7,7 @@ use std::path::Path; use memmem::{Searcher, TwoWaySearcher}; use anyhow::Result; +#[derive(Debug)] pub struct Raw { pub offset: usize, pub size: usize, diff --git a/src/fot/save.rs b/src/fot/save.rs index 24b13e4..f9d7323 100644 --- a/src/fot/save.rs +++ b/src/fot/save.rs @@ -7,7 +7,9 @@ use anyhow::anyhow; use anyhow::Result; use inflate::inflate_bytes_zlib; use deflate::deflate_bytes_zlib; +use crate::fot::decoder::Decoder; use crate::fot::raw::Raw; +use crate::fot::decoder; #[derive(Debug)] pub struct World { @@ -98,4 +100,11 @@ impl Save { Ok(()) } + + pub fn test(&self) -> Result<()> { + let a = "hello".to_string().encode(); + dbg!(a); + + Ok(()) + } } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 521cd2d..7e64e22 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,5 +18,6 @@ fn main() { println!("World {:x} size {}", w.offset, w.size); } - save.save(Path::new("out.sav")).expect("failed to save"); + //save.save(Path::new("out.sav")).expect("failed to save"); + save.test().expect("test"); } \ No newline at end of file