1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
mod parser;
mod writer;

use super::Script;
use parser::take_file;
use std::fs::File;
use std::io::prelude::*;
use std::path::Path;

pub struct MscsbFile {
    pub scripts: Vec<Script>,
    pub strings: Vec<String>,
    pub entrypoint: u32,
}

impl MscsbFile {
    pub fn open<P: AsRef<Path>>(path: P) -> Option<MscsbFile> {
        let mut buffer = vec![];
        File::open(path).ok()?.read_to_end(&mut buffer).ok()?;
        Some(take_file(&buffer[..]).unwrap().1)
    }

    pub fn write_to_file<P: AsRef<Path>>(&self, path: P) -> std::io::Result<()> {
        let mut buffer = vec![];
        self.write(&mut buffer);
        File::create(path)?
            .write_all(&buffer[..])?;
        Ok(())
    }

    pub fn iter(&self) -> std::slice::Iter<Script> {
        self.scripts.iter()
    }

    pub fn get_script_from_loc(&self, loc: u32) -> Option<usize> {
        for i in 0..self.scripts.len() {
            if self.scripts[i].bounds.0 == loc {
                return Some(i);
            }
        }
        None
    }
}