summaryrefslogtreecommitdiff
path: root/src/main.rs
blob: fb331056e15862c84ec65ac6dd300c062591080d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// SPDX-License-Identifier: GPL-3.0-only
mod args;
use std::fs;
use std::env;
use std::process::exit;
use clap::Parser;
use crate::args::Cli;

fn main() {
    let cli = Cli::parse();
    
    let args: Vec<String> = env::args().collect();
    let xdg_data_dirs = std::env::var("XDG_DATA_DIRS").unwrap();    
    let data_dirs = xdg_data_dirs.split(":");
    
    let mut found = false;
    let home = match env::var("HOME") {
	    Ok(var) => var,
	    Err(_) => exit(1),
    };
    for dirs in data_dirs {
	    if (dirs.starts_with(&home) && cli.skip_home) || (dirs.starts_with(".") && cli.skip_dot) {
	        continue
	    }
	
	    let files = match fs::read_dir(format!("{}/applications",dirs)) {
        	    Ok(file) => file,
	        Err(_) => continue,
	    };
	    for file in files {
	        let desktop_file = format!("{}", file.as_ref().unwrap().file_name().into_string().unwrap());
	        let mut name = desktop_file.split(".");
	        if name.find(|x| *x == cli.search.strip_suffix(".desktop").unwrap_or(&cli.search)).is_some() {
	        	    let path = file.as_ref().unwrap().path();
            		let out = if cli.show_tilde {
	        	        format!("{}", path.display().to_string().replace(&home, "~"))
            		} else {
	        	        path.display().to_string()
	        	    };
	        	    println!("{}", out);
	        	    found = true;
	        	    if !cli.all {
        		        return
	        	    }
	        }
	    }
    }

    if !found {
	    eprintln!("No {} in ({})", args[1], xdg_data_dirs);
	    exit(1);
    }
}