From 8987565a2a8016eb4333a4f7c6dc644416aa2bc2 Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Mon, 23 Aug 2021 19:54:04 +0200 Subject: [PATCH] feat(service): Plugins may define a priority for their results Adds an additional parameter for prioritizing the search results from a specific plugin. The plugin may define a priority which will sort results after the initial pattern search. The web plugin will be the first plugin to utilize this feature --- service/src/lib.rs | 18 ++++++++++++++++++ service/src/plugins/config.rs | 16 ++++++++++++++++ service/src/plugins/help.rs | 1 + service/src/plugins/mod.rs | 2 +- 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/service/src/lib.rs b/service/src/lib.rs index 21c936f..4504574 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -454,6 +454,24 @@ impl Service { other => other, } }); + + active_search.sort_by(|a, b| { + let plug1 = match plugins.get(a.0) { + Some(plug) => plug, + None => return Ordering::Greater, + }; + + let plug2 = match plugins.get(b.0) { + Some(plug) => plug, + None => return Ordering::Less, + }; + + plug1 + .config + .query + .priority + .cmp(&plug2.config.query.priority) + }) } let take = if last_query.starts_with('/') | last_query.starts_with('~') { diff --git a/service/src/plugins/config.rs b/service/src/plugins/config.rs index 65a2fb0..d0febcf 100644 --- a/service/src/plugins/config.rs +++ b/service/src/plugins/config.rs @@ -52,6 +52,9 @@ pub struct PluginQuery { #[serde(default)] pub persistent: bool, + #[serde(default)] + pub priority: PluginPriority, + #[serde( default, skip_serializing_if = "Option::is_none", @@ -60,6 +63,19 @@ pub struct PluginQuery { pub regex: Option>, } +#[derive(Copy, Clone, Debug, Deserialize, Eq, PartialEq, PartialOrd, Ord)] +pub enum PluginPriority { + High = 0, + Default = 1, + Low = 2, +} + +impl Default for PluginPriority { + fn default() -> Self { + Self::Default + } +} + pub fn load(source: &Path, config_path: &Path) -> Option<(PathBuf, PluginConfig, Option)> { if let Ok(config_bytes) = std::fs::read_to_string(&config_path) { let config = match ron::from_str::(&config_bytes) { diff --git a/service/src/plugins/help.rs b/service/src/plugins/help.rs index 737ef4b..79855f6 100644 --- a/service/src/plugins/help.rs +++ b/service/src/plugins/help.rs @@ -16,6 +16,7 @@ pub const CONFIG: PluginConfig = PluginConfig { isolate: true, no_sort: true, persistent: false, + priority: PluginPriority::Default, regex: None, }, icon: Some(IconSource::Name(Cow::Borrowed("system-help-symbolic"))), diff --git a/service/src/plugins/mod.rs b/service/src/plugins/mod.rs index 43d06d9..adeea6e 100644 --- a/service/src/plugins/mod.rs +++ b/service/src/plugins/mod.rs @@ -2,7 +2,7 @@ mod config; pub(crate) mod external; pub mod help; -pub use self::config::{PluginBinary, PluginConfig, PluginQuery}; +pub use self::config::{PluginBinary, PluginConfig, PluginPriority, PluginQuery}; pub use self::external::ExternalPlugin; pub use self::help::HelpPlugin;