async_translate/manager/
mod.rs1use crate::translator::Translator;
4use anyhow::Result;
5use std::collections::HashMap;
6use unic_langid::LanguageIdentifier;
7
8pub struct TranslationManager {
10 translators: HashMap<String, Box<dyn Translator>>,
12}
13
14impl TranslationManager {
15 pub fn new() -> Self {
21 Self {
22 translators: HashMap::new(),
23 }
24 }
25
26 pub fn add_translator(&mut self, name: &str, translator: Box<dyn Translator>) {
33 self.translators.insert(name.to_string(), translator);
34 }
35
36 pub async fn translate(&self, translator_name: &str, text: &str, target_lang: &str) -> Result<String> {
48 let translator = self.translators
49 .get(translator_name)
50 .ok_or_else(|| anyhow::anyhow!("Translator '{}' not found", translator_name))?;
51
52 translator.translate(text, target_lang).await
53 }
54
55 pub async fn translate_langid(&self, translator_name: &str, text: &str, target_lang: &LanguageIdentifier) -> Result<String> {
67 let translator = self.translators
68 .get(translator_name)
69 .ok_or_else(|| anyhow::anyhow!("Translator '{}' not found", translator_name))?;
70
71 translator.translate_langid(text, target_lang).await
72 }
73
74 pub async fn translate_with_langid(&self, translator_name: &str, text: &str, source_lang: Option<&LanguageIdentifier>, target_lang: &LanguageIdentifier) -> Result<String> {
87 let translator = self.translators
88 .get(translator_name)
89 .ok_or_else(|| anyhow::anyhow!("Translator '{}' not found", translator_name))?;
90
91 translator.translate_with_langid(text, source_lang, target_lang).await
92 }
93
94 pub fn has_translator(&self, translator_name: &str) -> bool {
104 self.translators.contains_key(translator_name)
105 }
106
107 pub fn list_translators(&self) -> Vec<String> {
113 self.translators.keys().cloned().collect()
114 }
115}
116
117#[cfg(test)]
118mod tests;