use crate::core::config::Config;
use std::sync::Arc;
pub mod assistant;
pub mod bitable;
pub mod board;
pub mod comments;
pub mod docx;
pub mod drive;
pub mod permission;
pub mod sheets;
pub mod wiki;
pub use assistant::AssistantService;
pub use bitable::BitableService;
pub use board::BoardService;
pub use comments::CommentsService;
pub use docx::DocxService;
pub use drive::DriveService;
pub use permission::PermissionService;
pub use sheets::SheetsService;
pub use wiki::WikiService;
pub struct CloudDocsService {
pub drive: DriveService,
pub wiki: WikiService,
pub docx: DocxService,
pub sheets: SheetsService,
pub bitable: BitableService,
pub board: BoardService,
pub permission: PermissionService,
pub comments: CommentsService,
pub assistant: AssistantService,
}
impl CloudDocsService {
pub fn new(config: Config) -> Self {
Self {
drive: DriveService::new(config.clone()),
wiki: WikiService::new(config.clone()),
docx: DocxService::new(config.clone()),
sheets: SheetsService::new(config.clone()),
bitable: BitableService::new(config.clone()),
board: BoardService::new(config.clone()),
permission: PermissionService::new(config.clone()),
comments: CommentsService::new(config.clone()),
assistant: AssistantService::new(config.clone()),
}
}
pub fn new_from_shared(shared: Arc<Config>) -> Self {
Self {
drive: DriveService::new_from_shared(shared.clone()),
wiki: WikiService::new_from_shared(shared.clone()),
docx: DocxService::new_from_shared(shared.clone()),
sheets: SheetsService::new_from_shared(shared.clone()),
bitable: BitableService::new_from_shared(shared.clone()),
board: BoardService::new_from_shared(shared.clone()),
permission: PermissionService::new_from_shared(shared.clone()),
comments: CommentsService::new_from_shared(shared.clone()),
assistant: AssistantService::new_from_shared(shared),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Duration;
#[test]
fn test_cloud_docs_service_creation() {
let config = Config::default();
let service = CloudDocsService::new(config.clone());
let _ = &service.drive;
let _ = &service.wiki;
let _ = &service.docx;
let _ = &service.sheets;
let _ = &service.bitable;
let _ = &service.board;
let _ = &service.permission;
let _ = &service.comments;
let _ = &service.assistant;
let _ = &service.drive.v1;
let _ = &service.drive.v2;
let _ = &service.wiki.v2;
let _ = &service.docx.v1;
let _ = &service.bitable.v1;
let _ = &service.assistant.v1;
}
#[test]
fn test_cloud_docs_service_with_custom_config() {
let config = Config::builder()
.app_id("cloud_docs_test_app")
.app_secret("cloud_docs_test_secret")
.req_timeout(Duration::from_secs(300))
.build();
let service = CloudDocsService::new(config.clone());
let _ = &service.drive;
let _ = &service.wiki;
let _ = &service.docx;
let _ = &service.sheets;
let _ = &service.bitable;
let _ = &service.board;
let _ = &service.permission;
let _ = &service.comments;
let _ = &service.assistant;
}
#[test]
fn test_cloud_docs_service_config_independence() {
let config1 = Config::builder().app_id("cloud_docs_app_1").build();
let config2 = Config::builder().app_id("cloud_docs_app_2").build();
let service1 = CloudDocsService::new(config1);
let service2 = CloudDocsService::new(config2);
assert!(!std::ptr::eq(
std::ptr::addr_of!(service1.drive),
std::ptr::addr_of!(service2.drive)
));
assert!(!std::ptr::eq(
std::ptr::addr_of!(service1.wiki),
std::ptr::addr_of!(service2.wiki)
));
assert!(!std::ptr::eq(
std::ptr::addr_of!(service1.docx),
std::ptr::addr_of!(service2.docx)
));
assert!(!std::ptr::eq(
std::ptr::addr_of!(service1.sheets),
std::ptr::addr_of!(service2.sheets)
));
assert!(!std::ptr::eq(
std::ptr::addr_of!(service1.bitable),
std::ptr::addr_of!(service2.bitable)
));
assert!(!std::ptr::eq(
std::ptr::addr_of!(service1.board),
std::ptr::addr_of!(service2.board)
));
assert!(!std::ptr::eq(
std::ptr::addr_of!(service1.permission),
std::ptr::addr_of!(service2.permission)
));
assert!(!std::ptr::eq(
std::ptr::addr_of!(service1.comments),
std::ptr::addr_of!(service2.comments)
));
assert!(!std::ptr::eq(
std::ptr::addr_of!(service1.assistant),
std::ptr::addr_of!(service2.assistant)
));
}
#[test]
fn test_cloud_docs_service_sub_services_accessible() {
let config = Config::default();
let service = CloudDocsService::new(config.clone());
let _ = &service.drive.v1;
let _ = &service.drive.v2;
let _ = &service.wiki.v2;
let _ = &service.docx.v1;
let _ = &service.bitable.v1;
let _ = &service.assistant.v1;
let _ = &service.board.whiteboard;
}
#[test]
fn test_cloud_docs_service_config_cloning() {
let config = Config::builder()
.app_id("clone_test_app")
.app_secret("clone_test_secret")
.build();
let service = CloudDocsService::new(config.clone());
let _ = &service.drive;
let _ = &service.wiki;
let _ = &service.docx;
let _ = &service.sheets;
let _ = &service.bitable;
let _ = &service.board;
let _ = &service.permission;
let _ = &service.comments;
let _ = &service.assistant;
}
#[test]
fn test_cloud_docs_service_timeout_propagation() {
let config = Config::builder()
.req_timeout(Duration::from_secs(240))
.build();
let service = CloudDocsService::new(config);
let _ = &service.drive;
let _ = &service.wiki;
let _ = &service.docx;
let _ = &service.sheets;
let _ = &service.bitable;
let _ = &service.board;
let _ = &service.permission;
let _ = &service.comments;
let _ = &service.assistant;
}
#[test]
fn test_cloud_docs_service_multiple_instances() {
let config = Config::default();
let service1 = CloudDocsService::new(config.clone());
let service2 = CloudDocsService::new(config.clone());
let _ = &service1.drive;
let _ = &service2.drive;
let _ = &service1.wiki;
let _ = &service2.wiki;
let _ = &service1.docx;
let _ = &service2.docx;
let _ = &service1.sheets;
let _ = &service2.sheets;
let _ = &service1.bitable;
let _ = &service2.bitable;
let _ = &service1.board;
let _ = &service2.board;
let _ = &service1.permission;
let _ = &service2.permission;
let _ = &service1.comments;
let _ = &service2.comments;
let _ = &service1.assistant;
let _ = &service2.assistant;
}
#[test]
fn test_cloud_docs_service_config_consistency() {
let config = Config::builder()
.app_id("consistency_test")
.app_secret("consistency_secret")
.req_timeout(Duration::from_secs(360))
.build();
let service = CloudDocsService::new(config);
let _ = &service.drive;
let _ = &service.wiki;
let _ = &service.docx;
let _ = &service.sheets;
let _ = &service.bitable;
let _ = &service.board;
let _ = &service.permission;
let _ = &service.comments;
let _ = &service.assistant;
}
}