use std::path::PathBuf;
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default, deny_unknown_fields)]
pub(crate) struct ConfigFile {
pub detectors: Option<String>,
pub detectors_mode: Option<String>,
pub fast: Option<bool>,
pub deep: Option<bool>,
pub precision: Option<bool>,
pub no_decode: Option<bool>,
pub no_entropy: Option<bool>,
pub verify: Option<bool>,
pub timeout: Option<u64>,
pub verify_concurrency: Option<usize>,
pub max_commits: Option<usize>,
pub show_secrets: Option<bool>,
pub decode_size_limit: Option<String>,
pub entropy_source_files: Option<bool>,
pub generic_keyword_low_entropy: Option<bool>,
pub no_unicode_norm: Option<bool>,
pub no_ml: Option<bool>,
pub max_file_size: Option<String>,
pub regex_dfa_limit: Option<String>,
pub ml_weight: Option<f64>,
pub known_prefixes: Option<Vec<String>>,
pub secret_keywords: Option<Vec<String>>,
pub test_keywords: Option<Vec<String>>,
pub placeholder_keywords: Option<Vec<String>>,
pub scan: Option<ScanSection>,
pub allowlist: Option<AllowlistSection>,
pub detector: Option<std::collections::HashMap<String, DetectorSection>>,
pub lockdown: Option<LockdownSection>,
pub limits: Option<LimitsSection>,
pub http: Option<HttpSection>,
pub system: Option<SystemSection>,
pub aws: Option<AwsSection>,
pub tuning: Option<TuningSection>,
pub guard: Option<GuardSection>,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default, deny_unknown_fields)]
pub struct ScanSection {
pub severity: Option<String>,
pub min_confidence: Option<f64>,
pub ml_threshold: Option<f64>,
pub entropy_threshold: Option<f64>,
pub entropy_bpe_max_bytes_per_token: Option<f64>,
pub decode_depth: Option<usize>,
pub min_secret_len: Option<usize>,
pub format: Option<String>,
pub exclude: Option<Vec<String>>,
pub threads: Option<usize>,
pub reader_threads: Option<usize>,
pub fused_batch: Option<usize>,
pub fused_depth: Option<usize>,
pub per_chunk_timeout_ms: Option<u64>,
pub dedup: Option<String>,
pub incremental: Option<bool>,
pub incremental_cache: Option<PathBuf>,
pub gpu_batch_input_limit: Option<String>,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default, deny_unknown_fields)]
pub struct AllowlistSection {
pub file: Option<String>,
pub require_reason: Option<bool>,
pub require_approved_by: Option<bool>,
pub max_expires_days: Option<u64>,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default, deny_unknown_fields)]
pub struct DetectorSection {
pub enabled: Option<bool>,
pub min_confidence: Option<f64>,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default, deny_unknown_fields)]
pub(crate) struct LockdownSection {
pub require: Option<bool>,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default, deny_unknown_fields)]
pub struct LimitsSection {
pub stdin_bytes: Option<String>,
pub web_response_bytes: Option<String>,
pub s3_object_bytes: Option<String>,
pub gcs_object_bytes: Option<String>,
pub azure_blob_bytes: Option<String>,
pub cloud_max_objects: Option<usize>,
pub docker_tar_entry_bytes: Option<String>,
pub docker_image_config_bytes: Option<String>,
pub docker_tar_total_bytes: Option<String>,
pub git_line_bytes: Option<String>,
pub git_total_bytes: Option<String>,
pub git_blob_bytes: Option<String>,
pub git_chunks: Option<usize>,
pub hosted_git_pages: Option<usize>,
pub binary_read_bytes: Option<String>,
pub binary_decompiled_bytes: Option<String>,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default, deny_unknown_fields)]
pub struct HttpSection {
pub proxy: Option<String>,
pub insecure_tls: Option<bool>,
pub allow_private_endpoint: Option<bool>,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default, deny_unknown_fields)]
pub struct SystemSection {
pub trusted_bin_dirs: Option<Vec<PathBuf>>,
pub cache_dir: Option<PathBuf>,
pub autoroute_cache: Option<String>,
pub matcher_cache: Option<String>,
pub calibration_cache: Option<PathBuf>,
pub batch_pipeline: Option<bool>,
pub gpu: Option<String>,
pub autoroute_gpu: Option<bool>,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default, deny_unknown_fields)]
pub struct AwsSection {
pub canary_accounts: Option<Vec<String>>,
pub knockoff_accounts: Option<Vec<String>>,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default, deny_unknown_fields)]
pub struct TuningSection {
pub fallback_hs: Option<bool>,
pub hs_prefilter_max_len: Option<usize>,
pub hs_shard_target: Option<usize>,
pub fallback_anchor: Option<bool>,
pub homoglyph_gate: Option<bool>,
pub homoglyph_ascii_skip: Option<bool>,
pub fallback_reverse: Option<bool>,
pub prefilter_truncate: Option<bool>,
pub fallback_prefix_gate: Option<bool>,
pub decode_focus: Option<bool>,
pub confirmed_suffix_gate: Option<bool>,
pub confirmed_companion_gate: Option<bool>,
pub no_candidate_gate: Option<bool>,
pub fallback_localizer: Option<bool>,
pub gpu_recall_floor: Option<bool>,
pub chunk_lane_threshold: Option<usize>,
}
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default, deny_unknown_fields)]
pub(crate) struct GuardSection {
pub hot_index_memory: Option<String>,
pub max_pending_events_per_root: Option<usize>,
pub max_pending_events_total: Option<usize>,
pub coalesce_window: Option<String>,
pub scanner_residency: Option<String>,
pub scanner_idle_timeout: Option<String>,
pub scrub_interval: Option<String>,
pub subtree_max_files: Option<usize>,
pub subtree_max_depth: Option<usize>,
pub state_path: Option<String>,
}