diff options
author | delta <darkussdelta@gmail.com> | 2023-04-04 15:43:40 +0200 |
---|---|---|
committer | delta <darkussdelta@gmail.com> | 2023-04-04 15:43:40 +0200 |
commit | f7116d268aff3fae88d8de408e8c807295618a5c (patch) | |
tree | 6f52530d5799769e6af7c63bc5108f16f9aff742 /.config/awesome/quarrel/native/src/lenses | |
parent | f0b32f45746c026d402651013b7e98315d6956a1 (diff) |
restructure and improve config
Diffstat (limited to '.config/awesome/quarrel/native/src/lenses')
4 files changed, 153 insertions, 0 deletions
diff --git a/.config/awesome/quarrel/native/src/lenses/application.rs b/.config/awesome/quarrel/native/src/lenses/application.rs new file mode 100644 index 0000000..4317c75 --- /dev/null +++ b/.config/awesome/quarrel/native/src/lenses/application.rs @@ -0,0 +1,95 @@ +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::lenses::entry::{ + entries_to_lua_table, + Entry, +}; + +fn parse_entry(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(()); + } + + if section.attr("OnlyShowIn").is_some() + || section.attr("Hidden").is_some() + || section.attr("NoDisplay").is_some() + { + return Err(()); + } + + 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' => { + if let Some(icon) = section.attr("Icon") { + new_exec.replace_range(index..index + 2, &format!("--icon {icon}")); + } + } + '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| matches!(e.extension(), Some(ext) if ext == "desktop")) + .collect::<Vec<_>>(); + + let mut parsed_entries: Mutex<Vec<Entry>> = Mutex::new(Vec::new()); + + entries.into_par_iter().for_each(|path| { + let Ok(entry) = fd::parse_entry(&path) else { + return + }; + + if let Ok(parsed_entry) = parse_entry(&entry, &path) { + parsed_entries.lock().push(parsed_entry); + } + }); + + 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/quarrel/native/src/lenses/calculator.rs b/.config/awesome/quarrel/native/src/lenses/calculator.rs new file mode 100644 index 0000000..89b738e --- /dev/null +++ b/.config/awesome/quarrel/native/src/lenses/calculator.rs @@ -0,0 +1,36 @@ +// use meval::eval_str; +use cpc::{ + eval, + units::Unit, +}; +use mlua::prelude::*; + +use crate::lenses::entry::{ + entries_to_lua_table, + Entry, +}; + +pub fn query<'a>(lua: &Lua, input: String) -> LuaResult<LuaTable> { + let result = match eval(input.trim(), true, Unit::Celsius, false) { + Ok(result) => { + format!( + "{}{}", + result.value, + match result.unit { + Unit::NoUnit => "".to_owned(), + _ => format!(" {:?}", result.unit), + } + ) + } + Err(_) => return lua.create_table(), + }; + + Ok(entries_to_lua_table( + vec![Entry { + message: result, + exec: None, + provider: "Calculator".to_string(), + }], + lua, + )) +} diff --git a/.config/awesome/quarrel/native/src/lenses/entry.rs b/.config/awesome/quarrel/native/src/lenses/entry.rs new file mode 100644 index 0000000..c7ac09e --- /dev/null +++ b/.config/awesome/quarrel/native/src/lenses/entry.rs @@ -0,0 +1,19 @@ +use mlua::{ + prelude::*, + LuaSerdeExt, +}; +use serde::Serialize; + +#[derive(Serialize, Clone)] +pub struct Entry { + pub message: String, + pub exec: Option<(String, bool)>, + 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/quarrel/native/src/lenses/mod.rs b/.config/awesome/quarrel/native/src/lenses/mod.rs new file mode 100644 index 0000000..d0db6f7 --- /dev/null +++ b/.config/awesome/quarrel/native/src/lenses/mod.rs @@ -0,0 +1,3 @@ +pub mod application; +pub mod calculator; +pub mod entry; |