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");
}
}