use crate::{error::TranslationError, options::TranslateOptions, translator::Translator};
use std::collections::HashMap;
use unic_langid::LanguageIdentifier;
pub struct TranslationManager {
translators: HashMap<String, Box<dyn Translator>>,
}
impl TranslationManager {
pub fn new() -> Self {
Self {
translators: HashMap::new(),
}
}
pub fn add_translator(&mut self, name: &str, translator: Box<dyn Translator>) {
self.translators.insert(name.to_string(), translator);
}
pub async fn translate_with_options(
&self,
translator_name: &str,
text: &str,
target_lang: &LanguageIdentifier,
source_lang: Option<&LanguageIdentifier>,
options: &TranslateOptions,
) -> Result<String, TranslationError> {
let translator = self.translators.get(translator_name).ok_or_else(|| {
TranslationError::ConfigurationError(format!(
"Translator '{}' not found",
translator_name
))
})?;
translator
.translate_with_options(text, target_lang, source_lang, options)
.await
}
pub async fn translate(
&self,
translator_name: &str,
text: &str,
target_lang: &LanguageIdentifier,
source_lang: Option<&LanguageIdentifier>,
) -> Result<String, TranslationError> {
self.translate_with_options(
translator_name,
text,
target_lang,
source_lang,
&TranslateOptions::default(),
)
.await
}
pub fn has_translator(&self, translator_name: &str) -> bool {
self.translators.contains_key(translator_name)
}
pub fn list_translators(&self) -> Vec<String> {
self.translators.keys().cloned().collect()
}
}
#[cfg(test)]
mod tests;