use std::{error::Error, fs, path::Path}; pub fn get_executables() -> Result, Box> { let mut executables: Vec = Vec::new(); get_files(Path::new("/usr/local"), &mut executables)?; get_files(Path::new("/bin"), &mut executables)?; match home::cargo_home() { Ok(cargo_home) => { get_files(&cargo_home.join("bin"), &mut executables)?; } Err(_) => (), } Ok(executables) } pub fn get_files(path: &Path, files: &mut Vec) -> Result<(), Box> { if !path.exists() { return Ok(()); } let dirs = fs::read_dir(path)?; for e in dirs { let entry = e.unwrap(); let file_type = entry.file_type()?; if file_type.is_dir() { get_files(&entry.path(), files)?; continue; } match entry.file_name().into_string() { Ok(file_name) => { if !files.contains(&file_name) { files.push(file_name) } } Err(_) => {} } } Ok(()) }