use crate::domain::Finding;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DryFindingKind {
DuplicateExact,
DuplicateSimilar,
Fragment,
DeadCodeUncalled,
DeadCodeTestOnly,
Wildcard,
Boilerplate,
RepeatedMatch,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct DryKindMeta {
pub html_kind_label: &'static str,
pub html_dead_code_tag: &'static str,
pub json_label: &'static str,
}
impl DryFindingKind {
pub const fn meta(self) -> DryKindMeta {
let (html, dead_tag, json) = match self {
Self::DuplicateExact => ("Exact", "", "exact"),
Self::DuplicateSimilar => ("Similar", "", "near_duplicate"),
Self::Fragment => ("Fragment", "", "fragment"),
Self::DeadCodeUncalled => ("Dead", "uncalled", "uncalled"),
Self::DeadCodeTestOnly => ("Dead", "test-only", "test_only"),
Self::Wildcard => ("Wildcard", "", "wildcard"),
Self::Boilerplate => ("Boilerplate", "", "boilerplate"),
Self::RepeatedMatch => ("Repeated", "", "repeated_match"),
};
DryKindMeta {
html_kind_label: html,
html_dead_code_tag: dead_tag,
json_label: json,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DuplicateParticipant {
pub function_name: String,
pub file: String,
pub line: usize,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FragmentParticipant {
pub function_name: String,
pub file: String,
pub line: usize,
pub end_line: usize,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RepeatedMatchParticipant {
pub function_name: String,
pub file: String,
pub line: usize,
pub arm_count: usize,
}
#[derive(Debug, Clone, PartialEq)]
pub enum DryFindingDetails {
Duplicate {
participants: Vec<DuplicateParticipant>,
similarity: Option<f64>,
},
Fragment {
participants: Vec<FragmentParticipant>,
statement_count: usize,
},
DeadCode {
qualified_name: String,
suggestion: Option<String>,
},
Wildcard {
module_path: String,
},
Boilerplate {
pattern_id: String,
struct_name: Option<String>,
suggestion: String,
},
RepeatedMatch {
enum_name: String,
participants: Vec<RepeatedMatchParticipant>,
},
}
#[derive(Debug, Clone, PartialEq)]
pub struct DryFinding {
pub common: Finding,
pub kind: DryFindingKind,
pub details: DryFindingDetails,
}