summaryrefslogtreecommitdiff
path: root/src/main.rs
blob: 27a4a79eae4b90b33bddb8853d1e2fa26dcbf506 (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);
    }
}