use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrchestratorDetectionConfig {
#[serde(default = "default_orchestrator_max_cyclomatic")]
pub max_cyclomatic: u32,
#[serde(default = "default_orchestrator_min_delegation_ratio")]
pub min_delegation_ratio: f64,
#[serde(default = "default_orchestrator_min_meaningful_callees")]
pub min_meaningful_callees: usize,
#[serde(default = "default_orchestrator_cognitive_weight")]
pub cognitive_weight: f64,
}
impl Default for OrchestratorDetectionConfig {
fn default() -> Self {
Self {
max_cyclomatic: default_orchestrator_max_cyclomatic(),
min_delegation_ratio: default_orchestrator_min_delegation_ratio(),
min_meaningful_callees: default_orchestrator_min_meaningful_callees(),
cognitive_weight: default_orchestrator_cognitive_weight(),
}
}
}
fn default_orchestrator_max_cyclomatic() -> u32 {
5 }
fn default_orchestrator_min_delegation_ratio() -> f64 {
0.2 }
fn default_orchestrator_min_meaningful_callees() -> usize {
2 }
fn default_orchestrator_cognitive_weight() -> f64 {
0.7 }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConstructorDetectionConfig {
#[serde(default = "default_constructor_patterns")]
pub patterns: Vec<String>,
#[serde(default = "default_constructor_max_cyclomatic")]
pub max_cyclomatic: u32,
#[serde(default = "default_constructor_max_cognitive")]
pub max_cognitive: u32,
#[serde(default = "default_constructor_max_length")]
pub max_length: usize,
#[serde(default = "default_constructor_max_nesting")]
pub max_nesting: u32,
#[serde(default = "default_constructor_ast_detection")]
pub ast_detection: bool,
}
impl Default for ConstructorDetectionConfig {
fn default() -> Self {
Self {
patterns: default_constructor_patterns(),
max_cyclomatic: default_constructor_max_cyclomatic(),
max_cognitive: default_constructor_max_cognitive(),
max_length: default_constructor_max_length(),
max_nesting: default_constructor_max_nesting(),
ast_detection: default_constructor_ast_detection(),
}
}
}
fn default_constructor_patterns() -> Vec<String> {
vec![
"new".to_string(),
"default".to_string(),
"from_".to_string(),
"with_".to_string(),
"create_".to_string(),
"make_".to_string(),
"build_".to_string(),
"of_".to_string(),
"empty".to_string(),
"zero".to_string(),
"any".to_string(),
]
}
fn default_constructor_max_cyclomatic() -> u32 {
2
}
fn default_constructor_max_cognitive() -> u32 {
3
}
fn default_constructor_max_length() -> usize {
15
}
fn default_constructor_max_nesting() -> u32 {
1
}
fn default_constructor_ast_detection() -> bool {
true
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccessorDetectionConfig {
#[serde(default = "default_accessor_enabled")]
pub enabled: bool,
#[serde(default = "default_accessor_single_word_patterns")]
pub single_word_patterns: Vec<String>,
#[serde(default = "default_accessor_prefix_patterns")]
pub prefix_patterns: Vec<String>,
#[serde(default = "default_accessor_max_cyclomatic")]
pub max_cyclomatic: u32,
#[serde(default = "default_accessor_max_cognitive")]
pub max_cognitive: u32,
#[serde(default = "default_accessor_max_length")]
pub max_length: usize,
#[serde(default = "default_accessor_max_nesting")]
pub max_nesting: u32,
}
impl Default for AccessorDetectionConfig {
fn default() -> Self {
Self {
enabled: default_accessor_enabled(),
single_word_patterns: default_accessor_single_word_patterns(),
prefix_patterns: default_accessor_prefix_patterns(),
max_cyclomatic: default_accessor_max_cyclomatic(),
max_cognitive: default_accessor_max_cognitive(),
max_length: default_accessor_max_length(),
max_nesting: default_accessor_max_nesting(),
}
}
}
fn default_accessor_enabled() -> bool {
true
}
fn default_accessor_single_word_patterns() -> Vec<String> {
vec![
"id".to_string(),
"name".to_string(),
"value".to_string(),
"kind".to_string(),
"type".to_string(),
"status".to_string(),
"code".to_string(),
"key".to_string(),
"index".to_string(),
]
}
fn default_accessor_prefix_patterns() -> Vec<String> {
vec![
"get_".to_string(),
"is_".to_string(),
"has_".to_string(),
"can_".to_string(),
"should_".to_string(),
"as_".to_string(),
"to_".to_string(),
"into_".to_string(),
]
}
fn default_accessor_max_cyclomatic() -> u32 {
2
}
fn default_accessor_max_cognitive() -> u32 {
1
}
fn default_accessor_max_length() -> usize {
10
}
fn default_accessor_max_nesting() -> u32 {
1
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DataFlowClassificationConfig {
#[serde(default = "default_data_flow_enabled")]
pub enabled: bool,
#[serde(default = "default_data_flow_min_confidence")]
pub min_confidence: f64,
#[serde(default = "default_data_flow_min_transformation_ratio")]
pub min_transformation_ratio: f64,
#[serde(default = "default_data_flow_max_business_logic_ratio")]
pub max_business_logic_ratio: f64,
}
impl Default for DataFlowClassificationConfig {
fn default() -> Self {
Self {
enabled: default_data_flow_enabled(),
min_confidence: default_data_flow_min_confidence(),
min_transformation_ratio: default_data_flow_min_transformation_ratio(),
max_business_logic_ratio: default_data_flow_max_business_logic_ratio(),
}
}
}
fn default_data_flow_enabled() -> bool {
false }
fn default_data_flow_min_confidence() -> f64 {
0.8
}
fn default_data_flow_min_transformation_ratio() -> f64 {
0.7
}
fn default_data_flow_max_business_logic_ratio() -> f64 {
0.3
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorHandlingConfig {
#[serde(default = "default_detect_async_errors")]
pub detect_async_errors: bool,
#[serde(default = "default_detect_context_loss")]
pub detect_context_loss: bool,
#[serde(default = "default_detect_propagation")]
pub detect_propagation: bool,
#[serde(default = "default_detect_panic_patterns")]
pub detect_panic_patterns: bool,
#[serde(default = "default_detect_swallowing")]
pub detect_swallowing: bool,
#[serde(default)]
pub custom_patterns: Vec<ErrorPatternConfig>,
#[serde(default)]
pub severity_overrides: Vec<SeverityOverride>,
}
impl Default for ErrorHandlingConfig {
fn default() -> Self {
Self {
detect_async_errors: default_detect_async_errors(),
detect_context_loss: default_detect_context_loss(),
detect_propagation: default_detect_propagation(),
detect_panic_patterns: default_detect_panic_patterns(),
detect_swallowing: default_detect_swallowing(),
custom_patterns: Vec::new(),
severity_overrides: Vec::new(),
}
}
}
fn default_detect_async_errors() -> bool {
true
}
fn default_detect_context_loss() -> bool {
true
}
fn default_detect_propagation() -> bool {
true
}
fn default_detect_panic_patterns() -> bool {
true
}
fn default_detect_swallowing() -> bool {
true
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorPatternConfig {
pub name: String,
pub pattern: String,
pub pattern_type: String,
pub severity: String,
pub description: String,
pub remediation: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SeverityOverride {
pub pattern: String,
pub context: String,
pub severity: String,
}