//! 元数据导出模块 //! //! 导出条款依赖图、复杂度指标等 use serde::{Deserialize, Serialize}; /// 条款元数据 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ClauseMetadata { pub id: String, pub level: String, pub title: String, pub parameter_count: usize, pub predicate_count: usize, pub obligation_count: usize, pub dependencies: Vec, pub complexity: ComplexityMetrics, } /// 复杂度指标 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ComplexityMetrics { /// McCabe复杂度 pub cyclomatic_complexity: usize, /// 条款耦合度 pub coupling: usize, /// 条款内聚度 pub cohesion: f64, } /// 元数据导出器 pub struct MetadataExporter; impl MetadataExporter { pub fn new() -> Self { Self } pub fn export(&self, ast: &crate::parser::Program) -> Result, String> { let mut metadata = Vec::new(); for clause in &ast.clauses { metadata.push(ClauseMetadata { id: clause.id.clone(), level: clause.level.to_string(), title: clause.title.clone(), parameter_count: clause.parameters.len(), predicate_count: clause.predicates.len(), obligation_count: clause.obligations.len(), dependencies: clause.depends_on.clone(), complexity: ComplexityMetrics { // 计算McCabe循环复杂度 // 公式:M = E - N + 2P // E = 边数(决策点) // N = 节点数(语句数) // P = 连通分量数(通常为1) // 简化计算:1 + 谓词数 + 义务数 cyclomatic_complexity: 1 + clause.predicates.len() + clause.obligations.len(), // 耦合度:依赖的条款数 coupling: clause.depends_on.len(), // 内聚度:根据参数、谓词、义务的关联性计算 // 简化版本:如果有参数且有义务,认为内聚度较高 cohesion: if clause.parameters.is_empty() || clause.obligations.is_empty() { 0.5 } else { 1.0 }, }, }); } Ok(metadata) } } impl Default for MetadataExporter { fn default() -> Self { Self::new() } }