use std::{
collections::HashSet,
sync::{Arc, LazyLock},
};
use anyhow::Result;
fn load_custom_extensions() -> Result<Vec<String>> {
Ok(Vec::new())
}
pub static BINARY_EXTENSIONS: LazyLock<Arc<HashSet<String>>> = LazyLock::new(|| {
let start = std::time::Instant::now();
let base_extensions = vec![
"png", "jpg", "jpeg", "gif", "bmp", "ico", "webp", "tiff", "tif", "avif", "heic", "heif",
"dng", "raw", "nef", "cr2", "arw", "orf", "rw2", "svg", "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "odt", "ods", "odp", "indd",
"zip", "tar", "gz", "bz2", "xz", "7z", "rar", "dmg", "iso", "ace", "cab", "lzh", "arj",
"br", "zst", "lz4", "lzo", "lzma", "tgz", "exe", "dll", "so", "dylib", "bin", "app", "deb", "rpm", "o", "obj", "lib", "a", "pdb",
"exp", "ilk", "mp3", "wav", "ogg", "flac", "aac", "mp4", "avi", "mkv", "mov", "wmv", "webm", "mp2",
"m4a", "wma", "amr", "ttf", "otf", "woff", "woff2", "eot",
"gpg", "pgp", "p12", "pfx", "der", "crt", "keystore", "db", "sqlite", "sqlite3", "mdb", "sst", "ldb", "wal", "snap", "dat", "sas7bdat",
"sas7bcat", "rdb", "dwg", "dxf", "skp", "3ds", "max", "blend", "fbx",
"gcno", "gcda", "gcov", "wasm", "webc", "img", "dmg", "vhd", "vmdk", "qcow2", "raw", "pyc", "pyo", "class", "jar", "war", "ear", "swf", "fla", "npy",
"nxt", "com", "bat", "cmd", "bas", "pic", "b", "mcw", "ind", "dsk", "z",
"gdiff", "srt", "zeno", "cba", "parquet", "avro", "orc",
"pak", "rpak", "webc", "toast", "data", "pt", "crl", "ptx", "sf", "jrprint", "sbt", "nepprj", "psf", "mac", "g3w", "hpi", "o5c", "cf1",
"car", "vwx", "md8", "amg", "lb6", "nk2", "dwb", "skn", "signal", "jsa", "hlp", "kcw",
"res", "cf2", "cwg", "vpk", "psbt", "sb",
"pack", "idx", "raftlog", "map", "pth", "wasmu", "avif", "part",
];
let mut all_extensions = HashSet::new();
for ext in base_extensions {
all_extensions.insert(ext.to_string());
}
match load_custom_extensions() {
Ok(custom) => {
if !custom.is_empty() {
tracing::info!("Loaded {} custom binary extensions", custom.len());
for ext in custom {
all_extensions.insert(ext);
}
}
}
Err(e) => {
tracing::warn!("Failed to load custom binary extensions: {}", e);
}
}
tracing::debug!(
"Binary extensions initialized with {} extensions in {:?}",
all_extensions.len(),
start.elapsed()
);
Arc::new(all_extensions)
});
pub fn is_binary_extension(extension: &str) -> bool {
BINARY_EXTENSIONS.contains(extension)
}