aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/quarrel/native/src/lenses
diff options
context:
space:
mode:
authordelta <darkussdelta@gmail.com>2023-04-04 15:43:40 +0200
committerdelta <darkussdelta@gmail.com>2023-04-04 15:43:40 +0200
commitf7116d268aff3fae88d8de408e8c807295618a5c (patch)
tree6f52530d5799769e6af7c63bc5108f16f9aff742 /.config/awesome/quarrel/native/src/lenses
parentf0b32f45746c026d402651013b7e98315d6956a1 (diff)
restructure and improve config
Diffstat (limited to '.config/awesome/quarrel/native/src/lenses')
-rw-r--r--.config/awesome/quarrel/native/src/lenses/application.rs95
-rw-r--r--.config/awesome/quarrel/native/src/lenses/calculator.rs36
-rw-r--r--.config/awesome/quarrel/native/src/lenses/entry.rs19
-rw-r--r--.config/awesome/quarrel/native/src/lenses/mod.rs3
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;