use crate::domain::Finding;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ComplexityFindingKind {
Cognitive,
Cyclomatic,
NestingDepth,
FunctionLength,
MagicNumber,
Unsafe,
ErrorHandling,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ComplexityKindMeta {
pub rule_id: &'static str,
pub ai_category: &'static str,
pub description: &'static str,
}
impl ComplexityFindingKind {
pub const fn meta(self) -> ComplexityKindMeta {
let (rule_id, ai_category, description) = match self {
Self::Cognitive => (
"complexity/cognitive",
"cognitive_complexity",
"cognitive complexity",
),
Self::Cyclomatic => (
"complexity/cyclomatic",
"cyclomatic_complexity",
"cyclomatic complexity",
),
Self::NestingDepth => ("complexity/nesting", "nesting_depth", "nesting depth"),
Self::FunctionLength => (
"complexity/function_length",
"long_function",
"function length",
),
Self::MagicNumber => ("complexity/magic_number", "magic_number", "magic number"),
Self::Unsafe => ("complexity/unsafe", "unsafe_block", "unsafe blocks"),
Self::ErrorHandling => (
"complexity/error_handling",
"error_handling",
"error-handling smells",
),
};
ComplexityKindMeta {
rule_id,
ai_category,
description,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ComplexityHotspotDetail {
pub line: usize,
pub nesting_depth: usize,
pub construct: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ComplexityFinding {
pub common: Finding,
pub kind: ComplexityFindingKind,
pub metric_value: usize,
pub threshold: usize,
pub hotspot: Option<ComplexityHotspotDetail>,
}