use std::collections::HashMap;
use crate::config::Config;
use crate::error::{Error, Result};
use super::code;
use super::language::Language;
pub struct JsonLanguageRepository {
config: Config,
cache: HashMap<String, Language>,
}
impl JsonLanguageRepository {
pub fn new(config: Config) -> Self {
JsonLanguageRepository {
config,
cache: HashMap::new(),
}
}
pub fn find(&mut self, language_code: &str) -> Result<&Language> {
let normalized = code::normalize(language_code);
if !self.cache.contains_key(&normalized) {
let json = self
.config
.read_language(&normalized)?
.ok_or_else(|| Error::UnsupportedLanguage(language_code.to_string()))?;
let language = Language::from_json(&json)?;
self.cache.insert(normalized.clone(), language);
}
Ok(self.cache.get(&normalized).expect("just inserted"))
}
pub fn list_codes(&self) -> Result<Vec<String>> {
self.config.list_language_codes()
}
pub fn exists(&self, language_code: &str) -> bool {
let normalized = code::normalize(language_code);
if self.cache.contains_key(&normalized) {
return true;
}
matches!(self.config.read_language(&normalized), Ok(Some(_)))
}
}