openlark-communication 0.15.0

飞书开放平台 Rust SDK - 企业级 API 客户端
Documentation
//! openlark-communication 链式调用入口(meta 风格,偏"模块入口")
//!
//! 说明:
//! - 本文件放在 `common/` 下,避免被 strict API 校验脚本计入"额外实现文件"。
//! - communication 模块 API 规模较大(IM/Contact/Moments 等)。为避免为大量 API 手写方法,
//!   这里先提供"bizTag 级入口 + Config 透传"。
//! - 具体 API 调用仍使用各 `*RequestBuilder/*Request` 的 `new(config)` / `execute(...)`。

use std::sync::Arc;

use openlark_core::config::Config;

/// Communication 链式入口:`communication.im` / `communication.contact` / `communication.moments`
#[derive(Debug, Clone)]
pub struct CommunicationClient {
    config: Arc<Config>,

    #[cfg(feature = "im")]
    pub im: ImClient,

    #[cfg(feature = "contact")]
    pub contact: ContactClient,

    #[cfg(feature = "moments")]
    pub moments: MomentsClient,
}

impl CommunicationClient {
    pub fn new(config: Config) -> Self {
        let config = Arc::new(config);
        Self {
            config: config.clone(),
            #[cfg(feature = "im")]
            im: ImClient::new(config.clone()),
            #[cfg(feature = "contact")]
            contact: ContactClient::new(config.clone()),
            #[cfg(feature = "moments")]
            moments: MomentsClient::new(config),
        }
    }

    pub fn config(&self) -> &Config {
        &self.config
    }
}

#[cfg(feature = "im")]
#[derive(Debug, Clone)]
pub struct ImClient {
    config: Arc<Config>,
}

#[cfg(feature = "im")]
impl ImClient {
    fn new(config: Arc<Config>) -> Self {
        Self { config }
    }

    pub fn config(&self) -> &Config {
        &self.config
    }
}

#[cfg(feature = "contact")]
#[derive(Debug, Clone)]
pub struct ContactClient {
    config: Arc<Config>,
}

#[cfg(feature = "contact")]
impl ContactClient {
    fn new(config: Arc<Config>) -> Self {
        Self { config }
    }

    pub fn config(&self) -> &Config {
        &self.config
    }
}

#[cfg(feature = "moments")]
#[derive(Debug, Clone)]
pub struct MomentsClient {
    config: Arc<Config>,
}

#[cfg(feature = "moments")]
impl MomentsClient {
    fn new(config: Arc<Config>) -> Self {
        Self { config }
    }

    pub fn config(&self) -> &Config {
        &self.config
    }
}

#[cfg(test)]
#[allow(unused_imports)]
mod tests {
    use super::*;

    fn create_test_config() -> Config {
        Config::builder()
            .app_id("test_app")
            .app_secret("test_secret")
            .build()
    }

    #[test]
    fn test_communication_client_creation() {
        let config = create_test_config();
        let client = CommunicationClient::new(config);
        assert_eq!(client.config().app_id(), "test_app");
    }

    #[test]
    fn test_communication_client_debug() {
        let config = create_test_config();
        let client = CommunicationClient::new(config);
        let debug_str = format!("{:?}", client);
        assert!(debug_str.contains("CommunicationClient"));
    }

    #[test]
    fn test_communication_client_clone() {
        let config = create_test_config();
        let client = CommunicationClient::new(config);
        let cloned = client.clone();
        assert_eq!(cloned.config().app_id(), "test_app");
    }

    #[cfg(feature = "im")]
    #[test]
    fn test_im_client_config() {
        let config = create_test_config();
        let client = CommunicationClient::new(config);
        assert_eq!(client.im.config().app_id(), "test_app");
    }

    #[cfg(feature = "contact")]
    #[test]
    fn test_contact_client_config() {
        let config = create_test_config();
        let client = CommunicationClient::new(config);
        assert_eq!(client.contact.config().app_id(), "test_app");
    }
}