use crate::control::CancellationToken;
use crate::file_types::{FileTypeMatch, NamedFileTypes};
use crate::walk_types::WalkOptions;
use std::collections::BTreeSet;
use std::ffi::OsStr;
use std::path::Path;
use std::time::Duration;
mod builder;
mod ignore_policy;
mod limits;
mod runtime;
mod walk;
pub use ignore_policy::IgnorePolicy;
pub use limits::ScanLimits;
const DEFAULT_MAX_FILE_BYTES: u64 = 1_500_000;
const DEFAULT_IGNORE_FILES: &[&str] = &[".gitignore", ".ignore", ".weavatrixignore"];
const DEFAULT_SKIP_DIRECTORIES: &[&str] = &[
".git",
".hg",
".svn",
".venv",
"__pycache__",
"build",
"coverage",
"dist",
"node_modules",
"target",
"vendor",
];
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum StandardSkips {
Enabled,
Disabled,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EvidenceMode {
Complete,
SelectedFiles,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CacheValidationPolicy {
Fast,
Strict,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ContentValidationPolicy {
Fast,
Strict,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ContentDiscoveryMode {
Streaming,
BufferedParallel,
}
#[derive(Debug, Clone)]
#[allow(clippy::struct_excessive_bools)]
pub struct ScanOptions {
pub max_file_bytes: u64,
pub extensions: BTreeSet<String>,
pub file_types: NamedFileTypes,
pub ignore_files: Vec<String>,
pub override_rules: Vec<String>,
pub ignore_policy: IgnorePolicy,
pub ignore_case_insensitive: bool,
pub skip_hidden: bool,
pub standard_skips: StandardSkips,
pub hash_file_contents: bool,
pub detect_binary_files: bool,
pub evidence: EvidenceMode,
pub parallelism: usize,
pub traversal_parallelism: Option<usize>,
pub content_parallelism: Option<usize>,
pub limits: ScanLimits,
pub cancellation: Option<CancellationToken>,
pub cache_validation: CacheValidationPolicy,
pub content_validation: ContentValidationPolicy,
pub content_discovery: ContentDiscoveryMode,
pub walk: WalkOptions,
}
impl Default for ScanOptions {
fn default() -> Self {
Self {
max_file_bytes: DEFAULT_MAX_FILE_BYTES,
extensions: BTreeSet::new(),
file_types: NamedFileTypes::default(),
ignore_files: DEFAULT_IGNORE_FILES
.iter()
.map(ToString::to_string)
.collect(),
override_rules: Vec::new(),
ignore_policy: IgnorePolicy::default(),
ignore_case_insensitive: false,
skip_hidden: false,
standard_skips: StandardSkips::Enabled,
hash_file_contents: true,
detect_binary_files: true,
evidence: EvidenceMode::Complete,
parallelism: 0,
traversal_parallelism: None,
content_parallelism: None,
limits: ScanLimits::default(),
cancellation: None,
cache_validation: CacheValidationPolicy::Fast,
content_validation: ContentValidationPolicy::Strict,
content_discovery: ContentDiscoveryMode::Streaming,
walk: WalkOptions::default().with_metadata(true),
}
}
}