use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Config {
pub core: CoreConfig,
pub snapshots: SnapshotConfig,
pub boundaries: BoundariesConfig,
pub patterns: PatternsConfig,
pub thresholds: ThresholdsConfig,
pub change_coupling: ChangeCouplingConfig,
pub output: OutputConfig,
pub determinism: DeterminismConfig,
pub bindings: BindingsConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CoreConfig {
pub languages: String,
pub exclude: Vec<String>,
pub random_seed: u64,
}
impl Default for CoreConfig {
fn default() -> Self {
Self {
languages: "auto".to_string(),
exclude: vec![
"**/vendor/**".to_string(),
"**/node_modules/**".to_string(),
"**/__pycache__/**".to_string(),
"**/dist/**".to_string(),
"**/build/**".to_string(),
"**/target/**".to_string(),
"**/.git/**".to_string(),
],
random_seed: 42,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SnapshotConfig {
pub dir: String,
pub retention: u32,
}
impl Default for SnapshotConfig {
fn default() -> Self {
Self {
dir: ".sdivi/snapshots".to_string(),
retention: 100,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BoundariesConfig {
pub spec_file: String,
pub leiden_gamma: f64,
pub stability_threshold: u32,
pub weighted_edges: bool,
#[serde(default = "default_leiden_min_compression_ratio")]
pub leiden_min_compression_ratio: f64,
#[serde(default = "default_leiden_max_recursion_depth")]
pub leiden_max_recursion_depth: u32,
}
fn default_leiden_min_compression_ratio() -> f64 {
0.1
}
fn default_leiden_max_recursion_depth() -> u32 {
32
}
impl Default for BoundariesConfig {
fn default() -> Self {
Self {
spec_file: ".sdivi/boundaries.yaml".to_string(),
leiden_gamma: 1.0,
stability_threshold: 3,
weighted_edges: false,
leiden_min_compression_ratio: 0.1,
leiden_max_recursion_depth: 32,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PatternsConfig {
pub categories: String,
pub min_pattern_nodes: u32,
pub scope_exclude: Vec<String>,
}
impl Default for PatternsConfig {
fn default() -> Self {
Self {
categories: "auto".to_string(),
min_pattern_nodes: 5,
scope_exclude: vec![],
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThresholdsConfig {
pub pattern_entropy_rate: f64,
pub convention_drift_rate: f64,
pub coupling_delta_rate: f64,
pub boundary_violation_rate: f64,
#[serde(default)]
pub overrides: BTreeMap<String, ThresholdOverride>,
}
impl Default for ThresholdsConfig {
fn default() -> Self {
Self {
pattern_entropy_rate: 2.0,
convention_drift_rate: 3.0,
coupling_delta_rate: 0.15,
boundary_violation_rate: 2.0,
overrides: BTreeMap::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThresholdOverride {
#[serde(skip_serializing_if = "Option::is_none")]
pub pattern_entropy_rate: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub convention_drift_rate: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub coupling_delta_rate: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub boundary_violation_rate: Option<f64>,
pub expires: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChangeCouplingConfig {
pub min_frequency: f64,
pub history_depth: u32,
}
impl Default for ChangeCouplingConfig {
fn default() -> Self {
Self {
min_frequency: 0.6,
history_depth: 500,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum OutputFormat {
#[default]
Text,
Json,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum ColorChoice {
#[default]
Auto,
Always,
Never,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OutputConfig {
pub format: OutputFormat,
pub color: ColorChoice,
}
impl Default for OutputConfig {
fn default() -> Self {
Self {
format: OutputFormat::Text,
color: ColorChoice::Auto,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeterminismConfig {
pub enforce_btree_order: bool,
}
impl Default for DeterminismConfig {
fn default() -> Self {
Self {
enforce_btree_order: true,
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct BindingsConfig {}