use crate::core::config::Config;
pub mod document_ai;
pub mod models;
pub mod optical_char_recognition;
pub mod speech_to_text;
pub mod translation;
use document_ai::DocumentAiService;
use optical_char_recognition::OpticalCharRecognitionService;
use speech_to_text::SpeechToTextService;
use translation::TranslationService;
pub struct AiService {
pub document_ai: DocumentAiService,
pub optical_char_recognition: OpticalCharRecognitionService,
pub speech_to_text: SpeechToTextService,
pub translation: TranslationService,
}
impl AiService {
pub fn new(config: Config) -> Self {
Self {
document_ai: DocumentAiService::new(config.clone()),
optical_char_recognition: OpticalCharRecognitionService::new(config.clone()),
speech_to_text: SpeechToTextService::new(config.clone()),
translation: TranslationService::new(config),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Duration;
#[test]
fn test_ai_service_creation() {
let config = Config::default();
let service = AiService::new(config.clone());
assert_eq!(service.document_ai.config.app_id, config.app_id);
assert_eq!(service.document_ai.config.app_secret, config.app_secret);
assert_eq!(
service.optical_char_recognition.config.app_id,
config.app_id
);
assert_eq!(service.speech_to_text.config.app_id, config.app_id);
assert_eq!(service.translation.config.app_secret, config.app_secret);
}
#[test]
fn test_ai_service_with_custom_config() {
let config = Config::builder()
.app_id("ai_test_app")
.app_secret("ai_test_secret")
.req_timeout(Duration::from_secs(220))
.build();
let service = AiService::new(config.clone());
assert_eq!(service.document_ai.config.app_id, "ai_test_app");
assert_eq!(service.document_ai.config.app_secret, "ai_test_secret");
assert_eq!(
service.document_ai.config.req_timeout,
Some(Duration::from_secs(220))
);
assert_eq!(
service.optical_char_recognition.config.app_id,
"ai_test_app"
);
assert_eq!(
service.speech_to_text.config.req_timeout,
Some(Duration::from_secs(220))
);
assert_eq!(service.translation.config.app_id, "ai_test_app");
}
#[test]
fn test_ai_service_config_independence() {
let config1 = Config::builder().app_id("ai_app_1").build();
let config2 = Config::builder().app_id("ai_app_2").build();
let service1 = AiService::new(config1);
let service2 = AiService::new(config2);
assert_eq!(service1.document_ai.config.app_id, "ai_app_1");
assert_eq!(service2.document_ai.config.app_id, "ai_app_2");
assert_ne!(
service1.document_ai.config.app_id,
service2.document_ai.config.app_id
);
assert_ne!(
service1.optical_char_recognition.config.app_id,
service2.optical_char_recognition.config.app_id
);
assert_ne!(
service1.speech_to_text.config.app_id,
service2.speech_to_text.config.app_id
);
assert_ne!(
service1.translation.config.app_id,
service2.translation.config.app_id
);
}
#[test]
fn test_ai_service_sub_services_accessible() {
let config = Config::default();
let service = AiService::new(config.clone());
assert_eq!(service.document_ai.config.app_id, config.app_id);
assert_eq!(
service.optical_char_recognition.config.app_id,
config.app_id
);
assert_eq!(service.speech_to_text.config.app_id, config.app_id);
assert_eq!(service.translation.config.app_id, config.app_id);
}
#[test]
fn test_ai_service_config_cloning() {
let config = Config::builder()
.app_id("clone_test_app")
.app_secret("clone_test_secret")
.build();
let service = AiService::new(config.clone());
assert_eq!(service.document_ai.config.app_id, "clone_test_app");
assert_eq!(service.document_ai.config.app_secret, "clone_test_secret");
assert_eq!(
service.optical_char_recognition.config.app_secret,
"clone_test_secret"
);
assert_eq!(service.speech_to_text.config.app_id, "clone_test_app");
assert_eq!(service.translation.config.app_secret, "clone_test_secret");
}
#[test]
fn test_ai_service_timeout_propagation() {
let config = Config::builder()
.req_timeout(Duration::from_secs(230))
.build();
let service = AiService::new(config);
assert_eq!(
service.document_ai.config.req_timeout,
Some(Duration::from_secs(230))
);
assert_eq!(
service.optical_char_recognition.config.req_timeout,
Some(Duration::from_secs(230))
);
assert_eq!(
service.speech_to_text.config.req_timeout,
Some(Duration::from_secs(230))
);
assert_eq!(
service.translation.config.req_timeout,
Some(Duration::from_secs(230))
);
}
#[test]
fn test_ai_service_multiple_instances() {
let config = Config::default();
let service1 = AiService::new(config.clone());
let service2 = AiService::new(config.clone());
assert_eq!(
service1.document_ai.config.app_id,
service2.document_ai.config.app_id
);
assert_eq!(
service1.document_ai.config.app_secret,
service2.document_ai.config.app_secret
);
assert_eq!(
service1.optical_char_recognition.config.app_id,
service2.optical_char_recognition.config.app_id
);
assert_eq!(
service1.speech_to_text.config.app_secret,
service2.speech_to_text.config.app_secret
);
assert_eq!(
service1.translation.config.app_id,
service2.translation.config.app_id
);
}
#[test]
fn test_ai_service_config_consistency() {
let config = Config::builder()
.app_id("consistency_test")
.app_secret("consistency_secret")
.req_timeout(Duration::from_secs(170))
.build();
let service = AiService::new(config);
assert_eq!(service.document_ai.config.app_id, "consistency_test");
assert_eq!(service.document_ai.config.app_secret, "consistency_secret");
assert_eq!(
service.document_ai.config.req_timeout,
Some(Duration::from_secs(170))
);
assert_eq!(
service.optical_char_recognition.config.app_id,
"consistency_test"
);
assert_eq!(
service.optical_char_recognition.config.app_secret,
"consistency_secret"
);
assert_eq!(
service.optical_char_recognition.config.req_timeout,
Some(Duration::from_secs(170))
);
assert_eq!(service.speech_to_text.config.app_id, "consistency_test");
assert_eq!(
service.speech_to_text.config.app_secret,
"consistency_secret"
);
assert_eq!(
service.speech_to_text.config.req_timeout,
Some(Duration::from_secs(170))
);
assert_eq!(service.translation.config.app_id, "consistency_test");
assert_eq!(service.translation.config.app_secret, "consistency_secret");
assert_eq!(
service.translation.config.req_timeout,
Some(Duration::from_secs(170))
);
}
}