debtmap 0.17.0

Code complexity and technical debt analyzer
Documentation
use super::{CascadeImpact, EffortEstimate, RiskReduction};

#[derive(Clone, Debug)]
pub struct ROI {
    pub value: f64,
    pub effort: EffortEstimate,
    pub direct_impact: RiskReduction,
    pub cascade_impact: CascadeImpact,
    pub confidence: f64,
    pub breakdown: ROIBreakdown,
}

#[derive(Clone, Debug)]
pub struct ROIBreakdown {
    pub components: Vec<ROIComponent>,
    pub formula: String,
    pub explanation: String,
    pub confidence_factors: Vec<ConfidenceFactor>,
}

#[derive(Clone, Debug)]
pub struct ROIComponent {
    pub name: String,
    pub value: f64,
    pub weight: f64,
    pub explanation: String,
}

#[derive(Clone, Debug)]
pub struct ConfidenceFactor {
    pub name: String,
    pub value: f64,
    pub reason: String,
}

impl ROI {
    pub fn effective_value(&self) -> f64 {
        self.value * self.confidence
    }

    pub fn is_high_priority(&self) -> bool {
        self.value > 2.0 && self.confidence > 0.7
    }

    pub fn total_impact(&self) -> f64 {
        self.direct_impact.percentage + self.cascade_impact.total_risk_reduction * 0.5
    }

    pub fn summary(&self) -> String {
        format!(
            "ROI: {:.2} | Risk Reduction: {:.1}% direct + {:.1}% cascade | Effort: {:.1}h | Confidence: {:.0}%",
            self.value,
            self.direct_impact.percentage,
            self.cascade_impact.total_risk_reduction,
            self.effort.hours,
            self.confidence * 100.0
        )
    }
}