deslop 0.1.0

A static analyzer that spots low-context and AI-assisted code patterns across naming, concurrency, security, performance, and test quality.
Documentation
use std::path::PathBuf;

use serde::Serialize;

#[derive(Debug, Clone)]
pub struct ScanOptions {
    pub root: PathBuf,
    pub respect_ignore: bool,
}

#[derive(Debug, Clone, Serialize)]
pub struct TimingBreakdown {
    pub discover_ms: u128,
    pub parse_ms: u128,
    pub index_ms: u128,
    pub heuristics_ms: u128,
    pub total_ms: u128,
}

#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum Severity {
    Info,
    Warning,
    Error,
}

#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum SymbolKind {
    Function,
    Method,
    Struct,
    Interface,
    Type,
}

#[derive(Debug, Clone, Serialize)]
pub struct ParseFailure {
    pub path: PathBuf,
    pub message: String,
}

#[derive(Debug, Clone, Serialize)]
pub struct FunctionFingerprint {
    pub name: String,
    pub kind: String,
    pub receiver_type: Option<String>,
    pub start_line: usize,
    pub end_line: usize,
    pub line_count: usize,
    pub comment_lines: usize,
    pub code_lines: usize,
    pub comment_to_code_ratio: f64,
    pub complexity_score: usize,
    pub symmetry_score: f64,
    pub boilerplate_err_guards: usize,
    pub contains_any_type: bool,
    pub contains_empty_interface: bool,
    pub type_assertion_count: usize,
    pub call_count: usize,
}

#[derive(Debug, Clone, Serialize)]
pub struct Finding {
    pub rule_id: String,
    pub severity: Severity,
    pub path: PathBuf,
    pub function_name: Option<String>,
    pub start_line: usize,
    pub end_line: usize,
    pub message: String,
    pub evidence: Vec<String>,
}

#[derive(Debug, Clone, Serialize)]
pub struct IndexSummary {
    pub package_count: usize,
    pub symbol_count: usize,
    pub import_count: usize,
}

#[derive(Debug, Clone, Serialize)]
pub struct FileReport {
    pub path: PathBuf,
    pub package_name: Option<String>,
    pub syntax_error: bool,
    pub byte_size: usize,
    pub functions: Vec<FunctionFingerprint>,
}

#[derive(Debug, Clone, Serialize)]
pub struct ScanReport {
    pub root: PathBuf,
    pub files_discovered: usize,
    pub files_analyzed: usize,
    pub functions_found: usize,
    pub files: Vec<FileReport>,
    pub findings: Vec<Finding>,
    pub index_summary: IndexSummary,
    pub parse_failures: Vec<ParseFailure>,
    pub timings: TimingBreakdown,
}

#[derive(Debug, Clone, Serialize)]
pub struct StageStats {
    pub min_ms: u128,
    pub max_ms: u128,
    pub mean_ms: f64,
    pub median_ms: f64,
}

#[derive(Debug, Clone, Serialize)]
pub struct BenchmarkRun {
    pub iteration: usize,
    pub timings: TimingBreakdown,
    pub files_analyzed: usize,
    pub functions_found: usize,
    pub findings_found: usize,
}

#[derive(Debug, Clone, Serialize)]
pub struct BenchmarkReport {
    pub root: PathBuf,
    pub warmups: usize,
    pub repeats: usize,
    pub files_analyzed: usize,
    pub functions_found: usize,
    pub findings_found: usize,
    pub discover: StageStats,
    pub parse: StageStats,
    pub index: StageStats,
    pub heuristics: StageStats,
    pub total: StageStats,
    pub runs: Vec<BenchmarkRun>,
}