ninres 0.0.2

Read commonly used Nintendo file formats.
Documentation
use anyhow::Result;
use ninres::{NinRes, NinResFile, Sarc};
use std::{fs, path::PathBuf};

static M1_MODEL_PACK: &[u8] = include_bytes!("../../assets/M1_Model.pack");

fn main() -> Result<()> {
    let sarc = Sarc::new(M1_MODEL_PACK);
    extract_sarc(sarc.unwrap(), "assets/extracted".into())
}

fn extract_sarc(sarc: Sarc, path: PathBuf) -> Result<()> {
    sarc.sfat_nodes
        .into_iter()
        .map(move |sfat| -> Result<_> {
            let mut path = path.clone();
            if let Some(sfat_path) = sfat.path {
                path.push(sfat_path);
                let mut folder_path = path.clone();
                folder_path.pop();
                if !folder_path.exists() {
                    fs::create_dir_all(folder_path)?;
                }

                let data = if let Some(data) = sfat.data_decompressed {
                    data
                } else {
                    sfat.data
                };

                match data.as_ninres() {
                    Ok(file) => {
                        path.set_extension(file.get_extension().to_string());
                        if let NinResFile::Sarc(sarc) = file {
                            let mut base_path = path.clone();
                            base_path.pop();
                            base_path.push(path.file_stem().unwrap());
                            extract_sarc(sarc, base_path)?;
                        }
                    }
                    _ => {}
                }
                fs::write(path, data)?;
            }
            Ok(())
        })
        .collect::<Result<Vec<_>>>()?;
    Ok(())
}