summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..18ee8e9
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,51 @@
+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());
+ if desktop_file.contains(&cli.search) {
+ 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);
+ }
+}