1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
4pub struct ComparisonResult {
5 pub metadata: ComparisonMetadata,
7
8 pub target_item: Option<TargetComparison>,
10
11 pub project_health: ProjectHealthComparison,
13
14 pub regressions: Vec<RegressionItem>,
16
17 pub improvements: Vec<ImprovementItem>,
19
20 pub summary: ComparisonSummary,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct ComparisonMetadata {
26 pub comparison_date: String,
27 pub before_file: String,
28 pub after_file: String,
29 pub target_location: Option<String>,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct TargetComparison {
34 pub location: String,
35 #[serde(default)]
36 pub match_strategy: Option<String>,
37 #[serde(default)]
38 pub match_confidence: Option<f64>,
39 #[serde(default)]
40 pub matched_items_count: Option<usize>,
41 pub before: TargetMetrics,
42 pub after: Option<TargetMetrics>,
43 pub improvements: ImprovementMetrics,
44 pub status: TargetStatus,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
48pub struct TargetMetrics {
49 pub score: f64,
50 pub cyclomatic_complexity: u32,
51 pub cognitive_complexity: u32,
52 pub coverage: f64,
53 pub function_length: usize,
54 pub nesting_depth: u32,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct ImprovementMetrics {
59 pub score_reduction_pct: f64,
60 pub complexity_reduction_pct: f64,
61 pub coverage_improvement_pct: f64,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
65pub enum TargetStatus {
66 Resolved,
68 Improved,
70 Unchanged,
72 Regressed,
74 NotFoundBefore,
76 NotFound,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct ProjectHealthComparison {
82 pub before: ProjectMetrics,
83 pub after: ProjectMetrics,
84 pub changes: ProjectChanges,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize)]
88pub struct ProjectMetrics {
89 pub total_debt_score: f64,
90 pub total_items: usize,
91 pub critical_items: usize, pub high_priority_items: usize, pub average_score: f64,
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct ProjectChanges {
98 pub debt_score_change: f64,
99 pub debt_score_change_pct: f64,
100 pub items_change: i32,
101 pub critical_items_change: i32,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct RegressionItem {
106 pub location: String,
107 pub score: f64,
108 pub debt_type: String,
109 pub description: String,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct ImprovementItem {
114 pub location: String,
115 pub before_score: f64,
116 pub after_score: Option<f64>, pub improvement_type: ImprovementType,
118}
119
120#[derive(Debug, Clone, Serialize, Deserialize)]
121pub enum ImprovementType {
122 Resolved,
123 ScoreReduced,
124 ComplexityReduced,
125 CoverageImproved,
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize)]
129pub struct ComparisonSummary {
130 pub target_improved: bool,
131 pub new_critical_count: usize,
132 pub resolved_count: usize,
133 pub overall_debt_trend: DebtTrend,
134}
135
136#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
137pub enum DebtTrend {
138 Improving, Stable, Regressing, }