async_translate/manager/
mod.rs1use crate::{error::TranslationError, options::TranslateOptions, translator::Translator};
4use std::collections::HashMap;
5use unic_langid::LanguageIdentifier;
6
7pub struct TranslationManager {
9 translators: HashMap<String, Box<dyn Translator>>,
11}
12
13impl TranslationManager {
14 pub fn new() -> Self {
20 Self {
21 translators: HashMap::new(),
22 }
23 }
24
25 pub fn add_translator(&mut self, name: &str, translator: Box<dyn Translator>) {
32 self.translators.insert(name.to_string(), translator);
33 }
34
35 pub async fn translate_with_options(
49 &self,
50 translator_name: &str,
51 text: &str,
52 target_lang: &LanguageIdentifier,
53 source_lang: Option<&LanguageIdentifier>,
54 options: &TranslateOptions,
55 ) -> Result<String, TranslationError> {
56 let translator = self.translators.get(translator_name).ok_or_else(|| {
57 TranslationError::ConfigurationError(format!(
58 "Translator '{}' not found",
59 translator_name
60 ))
61 })?;
62
63 translator
64 .translate_with_options(text, target_lang, source_lang, options)
65 .await
66 }
67
68 pub async fn translate(
81 &self,
82 translator_name: &str,
83 text: &str,
84 target_lang: &LanguageIdentifier,
85 source_lang: Option<&LanguageIdentifier>,
86 ) -> Result<String, TranslationError> {
87 self.translate_with_options(
88 translator_name,
89 text,
90 target_lang,
91 source_lang,
92 &TranslateOptions::default(),
93 )
94 .await
95 }
96
97 pub fn has_translator(&self, translator_name: &str) -> bool {
107 self.translators.contains_key(translator_name)
108 }
109
110 pub fn list_translators(&self) -> Vec<String> {
116 self.translators.keys().cloned().collect()
117 }
118}
119
120#[cfg(test)]
121mod tests;