use super::format::round_ratio;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CohesionOutput {
pub score: f64,
pub internal_calls: usize,
pub external_calls: usize,
pub classification: CohesionClassification,
pub functions_analyzed: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum CohesionClassification {
High,
Medium,
Low,
}
impl CohesionClassification {
pub fn from_score(score: f64) -> Self {
if score >= 0.7 {
CohesionClassification::High
} else if score >= 0.4 {
CohesionClassification::Medium
} else {
CohesionClassification::Low
}
}
}
impl std::fmt::Display for CohesionClassification {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
CohesionClassification::High => write!(f, "High"),
CohesionClassification::Medium => write!(f, "Medium"),
CohesionClassification::Low => write!(f, "Low"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CohesionSummary {
pub average: f64,
pub high_cohesion_files: usize,
pub medium_cohesion_files: usize,
pub low_cohesion_files: usize,
}
pub fn build_cohesion_output(result: &crate::organization::FileCohesionResult) -> CohesionOutput {
CohesionOutput {
score: round_ratio(result.score),
internal_calls: result.internal_calls,
external_calls: result.external_calls,
classification: CohesionClassification::from_score(result.score),
functions_analyzed: result.functions_analyzed,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cohesion_classification_from_score() {
assert_eq!(
CohesionClassification::from_score(0.8),
CohesionClassification::High
);
assert_eq!(
CohesionClassification::from_score(0.7),
CohesionClassification::High
);
assert_eq!(
CohesionClassification::from_score(0.5),
CohesionClassification::Medium
);
assert_eq!(
CohesionClassification::from_score(0.4),
CohesionClassification::Medium
);
assert_eq!(
CohesionClassification::from_score(0.3),
CohesionClassification::Low
);
assert_eq!(
CohesionClassification::from_score(0.0),
CohesionClassification::Low
);
}
#[test]
fn test_cohesion_classification_display() {
assert_eq!(format!("{}", CohesionClassification::High), "High");
assert_eq!(format!("{}", CohesionClassification::Medium), "Medium");
assert_eq!(format!("{}", CohesionClassification::Low), "Low");
}
}