mod language_texts;
pub use language_texts::LanguageTexts;
use std::{fs::read_to_string, path::Path};
use crate::{Config, Value};
#[derive(Clone)]
pub struct Languages {
config: Config,
langs: Vec<LanguageTexts>,
}
impl Languages {
pub fn new(config: &Config) -> Self {
Self {
config: config.clone(),
langs: Vec::new(),
}
}
pub fn try_get_language(&mut self, lang: &str) -> anyhow::Result<LanguageTexts> {
if !self.config.get_languages().contains(&String::from(lang)) {
return Err(anyhow::Error::msg(format!(
"Cannot find the `{}` lang.",
lang
)));
}
for lang_texts in self.langs.iter() {
if lang_texts.get_language() == *lang {
return Ok(lang_texts.clone());
}
}
let path = Path::new(&self.config.get_directory()).join(format!(
"{}{}",
lang,
if cfg!(feature = "with-json") {
".json"
} else if cfg!(feature = "with-toml") {
".toml"
} else {
""
}
));
if !path.exists() {
return Err(anyhow::Error::msg(format!(
"Cannot find `{}` file.",
path.display()
)));
} else if !path.is_file() {
return Err(anyhow::Error::msg(format!(
"The path `{}` is not a file.",
path.display()
)));
}
let lang_texts = LanguageTexts::new(
String::from(lang),
Value::from_string(read_to_string(path)?)?,
)?;
self.langs.push(lang_texts.clone());
Ok(lang_texts)
}
pub fn try_get_text_from_language(
&mut self,
lang: &str,
text: &str,
) -> anyhow::Result<Option<Value>> {
Ok(self.try_get_language(lang)?.try_get_text(text))
}
}