find_browsers/
lib.rs

1#[cfg(target_os = "linux")]
2mod linux;
3
4#[cfg(target_os = "windows")]
5mod windows;
6
7use std::path::PathBuf;
8
9#[derive(Debug, Clone)]
10pub struct Browser {
11    pub name: String,
12    pub exec: PathBuf,
13}
14
15pub fn get_browsers() -> Result<Vec<Browser>, Box<dyn std::error::Error>> {
16    #[cfg(target_os = "windows")]
17    return windows::get_browsers();
18    #[cfg(target_os = "linux")]
19    return linux::get_browsers();
20    #[cfg(not(any(target_os = "windows", target_os = "linux")))]
21    return Err("Unsupported OS".into());
22}
23
24#[cfg(target_os = "linux")]
25pub fn get_executable_browsers() -> Result<Vec<Browser>, Box<dyn std::error::Error>> {
26    let browsers = get_browsers()?;
27    Ok(browsers.into_iter().filter(|b| b.exec.exists()).collect())
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    #[test]
35    fn print_browsers() {
36        let browsers = get_browsers().unwrap();
37        for browser in &browsers {
38            println!("Browser: {}\n Exec: {:?}", browser.name, browser.exec);
39        }
40        assert!(!browsers.is_empty(), "No browsers found");
41    }
42
43    #[cfg(target_os = "linux")]
44    #[test]
45    fn print_executable_browsers() {
46        let browsers = get_executable_browsers().unwrap();
47        for browser in &browsers {
48            println!("Executable Browser: {}\n Exec: {:?}", browser.name, browser.exec);
49            assert!(browser.exec.exists(), "Browser should exist");
50        }
51    }
52}