matrix-bridge-teams 0.1.0

A bridge between Matrix and Microsoft Teams written in Rust
mod parser;
mod validator;

use serde::{Deserialize, Serialize};
use std::path::PathBuf;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Config {
    pub bridge: BridgeConfig,
    pub auth: AuthConfig,
    pub logging: LoggingConfig,
    pub database: DatabaseConfig,
    pub room: RoomConfig,
    pub channel: ChannelConfig,
    pub limits: LimitsConfig,
    pub ghosts: GhostsConfig,
    pub metrics: MetricsConfig,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BridgeConfig {
    pub domain: String,
    pub homeserver_url: String,
    pub port: u16,
    pub bind_address: String,
    pub bridge_id: String,
    pub appservice_token: String,
    pub homeserver_token: String,
    pub presence_interval: u64,
    pub disable_presence: bool,
    pub disable_typing_notifications: bool,
    pub disable_deletion_forwarding: bool,
    pub disable_portal_bridging: bool,
    pub enable_self_service_bridging: bool,
    pub disable_read_receipts: bool,
    pub disable_join_leave_notifications: bool,
    pub disable_invite_notifications: bool,
    pub disable_room_topic_notifications: bool,
    pub determine_code_language: bool,
    pub admin_mxid: String,
    pub invalid_token_message: String,
    pub user_limit: Option<u32>,
    pub user_activity: UserActivityConfig,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserActivityConfig {
    pub min_user_active_days: u32,
    pub inactive_after_days: u32,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthConfig {
    pub tenant_id: String,
    pub client_id: String,
    pub client_secret: String,
    pub redirect_uri: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LoggingConfig {
    pub level: String,
    pub line_date_format: String,
    pub format: String,
    pub files: Vec<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DatabaseConfig {
    pub url: Option<String>,
    pub filename: Option<String>,
    pub max_connections: Option<u32>,
    pub min_connections: Option<u32>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RoomConfig {
    pub default_visibility: String,
    pub room_alias_prefix: String,
    pub enable_room_creation: bool,
    pub kick_for: u64,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChannelConfig {
    pub name_pattern: String,
    pub enable_channel_creation: bool,
    pub channel_name_format: String,
    pub topic_format: String,
    pub delete_options: DeleteOptionsConfig,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeleteOptionsConfig {
    pub disable_messaging: bool,
    pub unset_room_alias: bool,
    pub unlist_from_directory: bool,
    pub set_invite_only: bool,
    pub ghosts_leave: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LimitsConfig {
    pub room_ghost_join_delay: u64,
    pub teams_send_delay: u64,
    pub room_count: i32,
    pub matrix_event_age_limit_ms: u64,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GhostsConfig {
    pub nick_pattern: String,
    pub username_pattern: String,
    pub username_template: String,
    pub displayname_template: String,
    pub avatar_url_template: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricsConfig {
    pub enabled: bool,
    pub port: u16,
    pub bind_address: String,
}

impl Config {
    pub fn load() -> anyhow::Result<Self> {
        let config_path = std::env::var("CONFIG_PATH")
            .unwrap_or_else(|_| "config/config.yaml".to_string());
        
        parser::parse_config(&PathBuf::from(&config_path))
    }
}