use fallow_config::CyclomaticPolicy;
use fallow_types::extract::{ComplexityContribution, ComplexityMetric, FunctionComplexity};
#[must_use]
pub(super) fn gate_cyclomatic(function: &FunctionComplexity, policy: CyclomaticPolicy) -> u16 {
match policy {
CyclomaticPolicy::Standard => function.cyclomatic,
CyclomaticPolicy::LiteralMembership => function
.cyclomatic
.saturating_sub(literal_membership_increments(function)),
}
}
fn literal_membership_increments(function: &FunctionComplexity) -> u16 {
let count = function
.contributions
.iter()
.filter(|contribution| {
contribution.literal_membership
&& matches!(contribution.metric, ComplexityMetric::Cyclomatic)
})
.map(|contribution| contribution.weight)
.fold(0_u16, u16::saturating_add);
count.min(function.cyclomatic.saturating_sub(1))
}
#[must_use]
pub(super) fn standard_cyclomatic(
function: &FunctionComplexity,
policy: CyclomaticPolicy,
) -> Option<u16> {
let gated = gate_cyclomatic(function, policy);
(gated != function.cyclomatic).then_some(function.cyclomatic)
}
#[must_use]
pub(super) fn breakdown_contributions(
function: &FunctionComplexity,
policy: CyclomaticPolicy,
) -> Vec<ComplexityContribution> {
let mut contributions = function.contributions.clone();
if policy.is_standard() {
for contribution in &mut contributions {
contribution.literal_membership = false;
}
}
contributions
}