only_scraper 0.1.2

Only scrape webpages
Documentation
use std::env;
use std::io::{self, ErrorKind};
use std::path::{Path, PathBuf};

pub fn find_executable() -> io::Result<PathBuf> {
    if let Ok(path) = env::var("CHROME_SCRIPT") {
        if Path::new(&path).exists() {
            print!("stored, env var");
            return Ok(PathBuf::from(path));
        }
    }

    let path_var = match env::var_os("PATH") {
        Some(paths) => paths,
        None => {
            return Err(io::Error::new(
                ErrorKind::NotFound,
                "PATH environment variable not found".to_string(),
            ))
        }
    };

    for app in possible_executable_names().iter() {
        for path in env::split_paths(&path_var) {
            let exe_path = path.join(app);
            if exe_path.is_file() && is_executable(&exe_path) {
                return Ok(exe_path);
            }
        }
    }

    Err(io::Error::new(
        ErrorKind::NotFound,
        "Could not find a Chrome executable".to_string(),
    ))
}

fn possible_executable_names() -> Vec<&'static str> {
    vec![
        "google-chrome",
        "google-chrome-stable",
        "google-chrome-beta",
        "google-chrome-dev",
        "google-chrome-unstable",
        "chromium",
        "chromium-browser",
        "microsoft-edge-stable",
        "microsoft-edge-beta",
        "microsoft-edge-dev",
        "chrome",
        "chrome-browser",
        "msedge",
        "microsoft-edge",
    ]
}

fn is_executable(path: &Path) -> bool {
    #[cfg(unix)]
    {
        use std::os::unix::fs::PermissionsExt;
        if let Ok(metadata) = path.metadata() {
            let permissions = metadata.permissions();
            permissions.mode() & 0o111 != 0
        } else {
            false
        }
    }
    #[cfg(not(unix))]
    {
        path.is_file()
    }
}