ignis 0.1.0

A library for editing various 3DSFE formats.
Documentation
use crate::model::Language;
use anyhow::{anyhow, Result};
use std::path::Path;

fn split_path(original: &str) -> Result<(&str, &str)> {
    let path = Path::new(original);
    let parent = path
        .parent()
        .ok_or(anyhow!("Unable to find parent folder in path {}", original))?;
    let parent = parent
        .to_str()
        .ok_or(anyhow!("Unable to convert path to string {}", original))?;
    let filename = path
        .file_name()
        .ok_or(anyhow!("Unable to find filename in path {}", original))?;
    let filename = filename
        .to_str()
        .ok_or(anyhow!("Error converting OS str to str {}", original))?;
    Ok((parent, filename))
}

pub trait PathLocalizer {
    fn localize_path(&self, original: &str, language: &Language) -> Result<String>;
}

pub struct FE14PathLocalizer;

impl PathLocalizer for FE14PathLocalizer {
    fn localize_path(&self, original: &str, language: &Language) -> Result<String> {
        let (parent, filename) = split_path(original)?;
        let mut result = String::new();
        result.push_str(parent);
        result.push_str("/");
        match language {
            Language::EnglishNA => result.push_str("@E/"),
            Language::EnglishEU => result.push_str("@U/"),
            Language::Japanese => result.push_str(""),
            Language::German => result.push_str("@G/"),
            Language::Italian => result.push_str("@I/"),
            Language::Spanish => result.push_str("@S/"),
            Language::French => result.push_str("@F/"),
        }
        result.push_str(filename);
        Ok(result)
    }
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn fe14_localize_path_success() {
        let localizer = FE14PathLocalizer {};
        let result = localizer.localize_path("/m/GameData.bin.lz", &Language::EnglishNA);
        assert!(result.is_ok());
        assert_eq!(result.unwrap(), "/m/@E/GameData.bin.lz");
        let result = localizer.localize_path("/m/GameData.bin.lz", &Language::Japanese);
        assert!(result.is_ok());
        assert_eq!(result.unwrap(), "/m/GameData.bin.lz");
    }
}