aoe2-probe 0.1.1

A rust library for editing aoe2scenorio files from AoE2 DE.
Documentation
use crate::generator::IncrementalGenerator;
use crate::versio::ver1_46;
use crate::versio::VersioIsh;
use std::fs::OpenOptions;
use std::io::Write;
use std::{
    fs::{self, File},
    io::Read,
};

pub struct Scenorio {
    versio: Box<dyn VersioIsh>,
}

impl Scenorio {
    pub fn from_file(filename: &str) -> Self {
        let mut file = File::open(&filename).expect("File not found");
        let metadata = fs::metadata(&filename).expect("Unable to read metadata");
        let mut buffer = vec![0; metadata.len() as usize];
        file.read(&mut buffer).expect("buffer overflow");

        let version = Self::get_scenorio_version(&mut buffer);
        let mut generator = IncrementalGenerator::init(buffer);

        let versio = match version.as_str() {
            "1.46" => ver1_46::Versio::from_buffer(&mut generator),
            _ => panic!("Unsupport version!"),
        };
        Scenorio {
            versio: Box::new(versio),
        }
    }

    pub fn from_buffer(buffer: &Vec<u8>) -> Self {
        let mut buffer = buffer.clone();
        let version = Self::get_scenorio_version(&mut buffer);
        let mut generator = IncrementalGenerator::init(buffer);

        let versio = match version.as_str() {
            "1.46" => ver1_46::Versio::from_buffer(&mut generator),
            _ => panic!("Unsupport version!"),
        };
        Scenorio {
            versio: Box::new(versio),
        }
    }

    pub fn to_file(&self, file_full_path: &str) {
        let mut buffer = Vec::<u8>::new();
        self.versio.to_buffer(&mut buffer);

        let path = std::path::Path::new(file_full_path);
        let prefix = path.parent().unwrap();
        std::fs::create_dir_all(prefix).unwrap();

        let mut file = OpenOptions::new()
            .create(true)
            .write(true)
            .open(file_full_path)
            .unwrap();

        file.write_all(&buffer).unwrap();
    }

    fn get_scenorio_version(buffer: &Vec<u8>) -> String {
        std::str::from_utf8(&buffer[0..4]).unwrap().to_string()
    }

    pub fn versio(&self) -> &Box<dyn VersioIsh> {
        &self.versio
    }

    pub fn versio_mut(&mut self) -> &mut Box<dyn VersioIsh> {
        &mut self.versio
    }
}