moduforge-state 0.7.0

不可变数据结构与事务系统基础
Documentation
use std::collections::{HashMap, HashSet};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use anyhow::Result;

use super::dependency::DependencyManager;
use super::plugin::Plugin;

/// 插件管理器 - 初始化后不可变
///
/// # 设计理念
///
/// - **初始化阶段**: 使用 `PluginManagerBuilder` 注册和配置插件
/// - **运行时阶段**: 插件列表完全只读,零锁开销
/// - **性能优化**: 预计算排序结果,避免运行时重复计算
///
/// # 性能对比
///
/// **旧实现 (使用 RwLock)**:
/// - `get_sorted_plugins()`: 需要获取 2 个读锁 → ~500ns
/// - 高并发场景存在锁竞争
///
/// **新实现 (无锁)**:
/// - `get_sorted_plugins()`: 直接返回 Arc → ~50ns (10x 提升)
/// - 零锁竞争,完美并发扩展
///
/// # 示例
///
/// ```rust
/// use mf_state::plugin::{PluginManagerBuilder, Plugin};
///
/// // 初始化阶段
/// let mut builder = PluginManagerBuilder::new();
/// builder.register_plugin(plugin1)?;
/// builder.register_plugin(plugin2)?;
/// let manager = builder.build()?;
///
/// // 运行时阶段(零开销)
/// let plugins = manager.get_sorted_plugins_sync();
/// ```
#[derive(Debug, Clone)]
pub struct PluginManager {
    /// 插件映射表(初始化后不可变)
    plugins: Arc<HashMap<String, Arc<Plugin>>>,
    /// 排序后的插件列表(初始化后不可变,按依赖顺序)
    sorted_plugins: Arc<Vec<Arc<Plugin>>>,
    /// 初始化状态标记(使用原子操作,无锁)
    initialized: Arc<AtomicBool>,
}

/// 插件构建器 - 用于初始化阶段
///
/// 负责插件的注册、依赖分析和验证。构建完成后生成不可变的 `PluginManager`。
pub struct PluginManagerBuilder {
    plugins: HashMap<String, Arc<Plugin>>,
    dependency_manager: DependencyManager,
}

impl PluginManagerBuilder {
    /// 创建新的插件构建器
    pub fn new() -> Self {
        Self {
            plugins: HashMap::new(),
            dependency_manager: DependencyManager::new(),
        }
    }

    /// 注册插件
    ///
    /// # 错误
    ///
    /// - 插件名称重复
    /// - 依赖关系无效
    #[cfg_attr(feature = "dev-tracing", tracing::instrument(skip(self, plugin), fields(
        crate_name = "state",
        plugin_name = %plugin.spec.tr.metadata().name
    )))]
    pub fn register_plugin(
        &mut self,
        plugin: Arc<Plugin>,
    ) -> Result<()> {
        let plugin_name = plugin.spec.tr.metadata().name.clone();

        // 检查插件是否已存在
        if self.plugins.contains_key(&plugin_name) {
            return Err(anyhow::anyhow!("插件 '{}' 已存在", plugin_name));
        }

        // 更新依赖图
        let metadata = plugin.spec.tr.metadata();
        self.dependency_manager.add_plugin(&metadata.name);
        for dep in &metadata.dependencies {
            self.dependency_manager.add_dependency(&metadata.name, dep)?;
        }

        // 注册插件
        self.plugins.insert(plugin_name.clone(), plugin);

        tracing::debug!("插件 '{}' 注册成功", plugin_name);
        Ok(())
    }

    /// 构建最终的 PluginManager
    ///
    /// 执行完整的依赖分析和冲突检测,生成优化的不可变结构。
    ///
    /// # 验证步骤
    ///
    /// 1. 检查循环依赖
    /// 2. 检查缺失的依赖
    /// 3. 检查插件冲突
    /// 4. 计算拓扑排序
    ///
    /// # 错误
    ///
    /// - 存在循环依赖
    /// - 依赖的插件不存在
    /// - 存在冲突的插件
    /// - 拓扑排序失败
    #[cfg_attr(feature = "dev-tracing", tracing::instrument(skip(self), fields(
        crate_name = "state",
        plugin_count = self.plugins.len()
    )))]
    pub fn build(self) -> Result<PluginManager> {
        // 1. 检查循环依赖
        if self.dependency_manager.has_circular_dependencies() {
            let report =
                self.dependency_manager.get_circular_dependency_report();
            return Err(anyhow::anyhow!(
                "检测到循环依赖: {}",
                report.to_string()
            ));
        }

        // 2. 检查缺失的依赖
        let missing_report =
            self.dependency_manager.check_missing_dependencies();
        if missing_report.has_missing_dependencies {
            return Err(anyhow::anyhow!(
                "检测到缺失依赖: {}",
                missing_report.to_string()
            ));
        }

        // 3. 检查插件冲突
        let available_plugins: HashSet<String> =
            self.plugins.keys().cloned().collect();
        for (name, plugin) in &self.plugins {
            let metadata = plugin.spec.tr.metadata();
            for conflict in &metadata.conflicts {
                if available_plugins.contains(conflict) {
                    return Err(anyhow::anyhow!(
                        "插件 '{}' 与插件 '{}' 冲突",
                        name,
                        conflict
                    ));
                }
            }
        }

        // 4. 计算拓扑排序
        let plugin_order = self.dependency_manager.get_topological_order()?;

        // 5. 构建排序后的插件列表
        let sorted_plugins: Vec<Arc<Plugin>> = plugin_order
            .iter()
            .filter_map(|name| self.plugins.get(name).cloned())
            .collect();

        tracing::info!(
            "插件管理器构建完成,共注册 {} 个插件",
            self.plugins.len()
        );

        Ok(PluginManager {
            plugins: Arc::new(self.plugins),
            sorted_plugins: Arc::new(sorted_plugins),
            initialized: Arc::new(AtomicBool::new(true)),
        })
    }
}

impl Default for PluginManagerBuilder {
    fn default() -> Self {
        Self::new()
    }
}

impl PluginManager {
    /// 创建空的插件管理器(用于测试)
    pub fn new() -> Self {
        Self {
            plugins: Arc::new(HashMap::new()),
            sorted_plugins: Arc::new(Vec::new()),
            initialized: Arc::new(AtomicBool::new(true)),
        }
    }

    /// 获取排序后的插件列表(异步接口,兼容现有代码)
    ///
    /// # 性能
    ///
    /// - **旧版本**: 需要 2 个 RwLock 读锁 (~500ns)
    /// - **新版本**: 直接返回 Arc 克隆 (~50ns)
    ///
    /// # 注意
    ///
    /// 虽然这是异步函数,但实际是纯内存操作,不会阻塞。
    /// 保留异步签名是为了兼容现有的异步调用链。
    #[inline]
    pub async fn get_sorted_plugins(&self) -> Vec<Arc<Plugin>> {
        // 直接返回预计算的排序列表,零开销
        self.sorted_plugins.as_ref().clone()
    }

    /// 获取排序后的插件列表(同步接口,推荐使用)
    ///
    /// 返回切片引用,避免不必要的克隆。
    ///
    /// # 示例
    ///
    /// ```rust
    /// for plugin in manager.get_sorted_plugins_sync() {
    ///     plugin.apply(...).await?;
    /// }
    /// ```
    #[inline]
    pub fn get_sorted_plugins_sync(&self) -> &[Arc<Plugin>] {
        self.sorted_plugins.as_ref()
    }

    /// 检查初始化状态(异步接口,兼容现有代码)
    ///
    /// 使用原子操作,无锁开销 (~5ns)。
    #[inline]
    pub async fn is_initialized(&self) -> bool {
        self.initialized.load(Ordering::Acquire)
    }

    /// 检查初始化状态(同步接口,推荐使用)
    #[inline]
    pub fn is_initialized_sync(&self) -> bool {
        self.initialized.load(Ordering::Acquire)
    }

    /// 获取插件总数
    #[inline]
    pub fn plugin_count(&self) -> usize {
        self.plugins.len()
    }

    /// 根据名称获取插件
    ///
    /// # 性能
    ///
    /// HashMap 查找: O(1),约 10-20ns
    #[inline]
    pub fn get_plugin(
        &self,
        name: &str,
    ) -> Option<&Arc<Plugin>> {
        self.plugins.get(name)
    }

    /// 检查插件是否存在
    #[inline]
    pub fn has_plugin(
        &self,
        name: &str,
    ) -> bool {
        self.plugins.contains_key(name)
    }
}

impl Default for PluginManager {
    fn default() -> Self {
        Self::new()
    }
}