diff options
| author | delta <darkussdelta@gmail.com> | 2023-03-04 22:04:55 +0100 |
|---|---|---|
| committer | delta <darkussdelta@gmail.com> | 2023-03-04 22:18:21 +0100 |
| commit | f0b32f45746c026d402651013b7e98315d6956a1 (patch) | |
| tree | f42609e98522da081cebdd21a674a702d1054bbc /.config/awesome/ui/fresnel/lenses/src | |
| parent | a0f8b5fa6acdd1c2477fb1881dd9067956bf0ae6 (diff) | |
restructure awesome config, add fresnel
Diffstat (limited to '.config/awesome/ui/fresnel/lenses/src')
| -rw-r--r-- | .config/awesome/ui/fresnel/lenses/src/application.rs | 107 | ||||
| -rw-r--r-- | .config/awesome/ui/fresnel/lenses/src/calculator.rs | 25 | ||||
| -rw-r--r-- | .config/awesome/ui/fresnel/lenses/src/entry.rs | 20 | ||||
| -rw-r--r-- | .config/awesome/ui/fresnel/lenses/src/lib.rs | 16 |
4 files changed, 168 insertions, 0 deletions
diff --git a/.config/awesome/ui/fresnel/lenses/src/application.rs b/.config/awesome/ui/fresnel/lenses/src/application.rs new file mode 100644 index 0000000..0cf6c1a --- /dev/null +++ b/.config/awesome/ui/fresnel/lenses/src/application.rs @@ -0,0 +1,107 @@ +use std::{ + fs::read_dir, + path::PathBuf, +}; + +use freedesktop_entry_parser as fd; +use mlua::prelude::*; +use parking_lot::Mutex; +use rayon::prelude::*; +use url::Url; + +use crate::entry::{ + entries_to_lua_table, + Entry, +}; + +fn parse_entry<'a>(entry: fd::Entry, path: PathBuf) -> Result<Entry, ()> { + let section = entry.section("Desktop Entry"); + let name = section.attr("Name").ok_or(())?.to_string(); + + if section.attr("Type").ok_or(())? != "Application" { + return Err(()); + } + + match section.attr("OnlyShowIn") { + Some(_) => return Err(()), + None => {} + } + + match section.attr("Hidden") { + Some(_) => return Err(()), + None => {} + } + + match section.attr("NoDisplay") { + Some(_) => return Err(()), + None => {} + } + + let exec = section.attr("Exec").ok_or(())?.to_string(); + let mut new_exec = exec.clone(); + for (index, _) in exec.match_indices("%") { + match exec.chars().nth(index + 1).unwrap().to_ascii_lowercase() { + 'i' => match section.attr("Icon") { + Some(icon) => new_exec.replace_range(index..index + 2, &format!("--icon {}", icon)), + None => {} + }, + 'c' => new_exec.replace_range(index..index + 2, &name), + 'k' => new_exec.replace_range(index..index + 2, Url::from_file_path(&path)?.as_str()), + + 'f' | 'u' | 'v' | 'm' | 'd' | 'n' => new_exec.replace_range(index..index + 2, ""), + _ => continue, + } + } + + Ok(Entry { + message: name, + exec: Some(( + new_exec, + section + .attr("Terminal") + .unwrap_or("false") + .parse() + .map_err(drop)?, + )), + provider: "Application".to_string(), + }) +} + +pub fn query(lua: &Lua, input: String) -> LuaResult<LuaTable> { + let applications_dir = "/usr/share/applications"; + let entries = read_dir(applications_dir)? + .map(|result| result.map(|e| e.path())) + .collect::<Result<Vec<_>, std::io::Error>>()?; + + let entries = entries + .into_iter() + .filter(|e| match e.extension() { + Some(ext) if ext == "desktop" => true, + None | _ => false, + }) + .collect::<Vec<_>>(); + + let mut parsed_entries: Mutex<Vec<Entry>> = Mutex::new(Vec::new()); + + entries.into_par_iter().for_each(|path| { + let entry = match fd::parse_entry(&path) { + Ok(entry) => entry, + Err(_) => return, + }; + + match parse_entry(entry, path) { + Ok(parsed_entry) => parsed_entries.lock().push(parsed_entry), + Err(_) => return, + } + }); + + Ok(entries_to_lua_table( + parsed_entries + .get_mut() + .iter() + .filter(|entry| entry.message.to_lowercase().contains(&input)) + .map(|entry| (*entry).clone()) + .collect(), + lua, + )) +} diff --git a/.config/awesome/ui/fresnel/lenses/src/calculator.rs b/.config/awesome/ui/fresnel/lenses/src/calculator.rs new file mode 100644 index 0000000..792985d --- /dev/null +++ b/.config/awesome/ui/fresnel/lenses/src/calculator.rs @@ -0,0 +1,25 @@ +use meval::eval_str; +use mlua::prelude::*; + +use crate::entry::{ + entries_to_lua_table, + Entry, +}; + +pub fn query(lua: &Lua, input: String) -> LuaResult<LuaTable> { + println!("{:?}", input); + let result = match eval_str(input.trim()) { + Ok(ok) => ok.to_string(), + Err(_) => return Ok(lua.create_table()?), + }; + + Ok(entries_to_lua_table( + vec![Entry { + message: result, + exec: None, + // icon: '', + provider: "Calculator".to_string(), + }], + lua, + )) +} diff --git a/.config/awesome/ui/fresnel/lenses/src/entry.rs b/.config/awesome/ui/fresnel/lenses/src/entry.rs new file mode 100644 index 0000000..d6e7467 --- /dev/null +++ b/.config/awesome/ui/fresnel/lenses/src/entry.rs @@ -0,0 +1,20 @@ +use mlua::{ + prelude::*, + LuaSerdeExt, +}; +use serde::Serialize; + +#[derive(Serialize, Clone)] +pub struct Entry { + pub message: String, + pub exec: Option<(String, bool)>, + // pub icon: char, + pub provider: String, +} + +pub fn entries_to_lua_table(entries: Vec<Entry>, lua: &Lua) -> LuaTable { + match lua.to_value(&entries).unwrap() { + LuaValue::Table(t) => t, + _ => unreachable!(), + } +} diff --git a/.config/awesome/ui/fresnel/lenses/src/lib.rs b/.config/awesome/ui/fresnel/lenses/src/lib.rs new file mode 100644 index 0000000..e4fc881 --- /dev/null +++ b/.config/awesome/ui/fresnel/lenses/src/lib.rs @@ -0,0 +1,16 @@ +mod application; +mod calculator; +mod entry; + +use mlua::prelude::*; + +#[mlua::lua_module] +fn lenses(lua: &Lua) -> LuaResult<LuaTable> { + let exports = lua.create_table()?; + // lua.create_fun + // exports.push(application::query)?; + exports.set("1", lua.create_function(calculator::query)?)?; + exports.set("2", lua.create_function(application::query)?)?; + + Ok(exports) +} |
