From 548c919daa5d880f4da006a8da03505886b77610 Mon Sep 17 00:00:00 2001 From: Pavel Ivanov Date: Tue, 28 Jan 2025 22:56:53 +0100 Subject: [PATCH] fix: fixed forced workspace mode enablement --- crates/atuin-client/src/settings.rs | 70 +++++++++++++++---- .../src/command/client/search/engines.rs | 11 ++- 2 files changed, 61 insertions(+), 20 deletions(-) diff --git a/crates/atuin-client/src/settings.rs b/crates/atuin-client/src/settings.rs index 4c2b10ab165..ca6264b9301 100644 --- a/crates/atuin-client/src/settings.rs +++ b/crates/atuin-client/src/settings.rs @@ -373,7 +373,28 @@ pub struct Daemon { #[derive(Clone, Debug, Deserialize, Serialize)] pub struct Search { /// The list of enabled filter modes, in order of priority. - pub filters: Vec, + pub filters: EnabledFilterModes, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct EnabledFilterModes(Vec); + +impl EnabledFilterModes { + pub fn specified(&self) -> &[FilterMode] { + &self.0 + } + + pub fn resolved(&self, legacy_workspaces: bool) -> &[FilterMode] { + if self.0.is_empty() { + if legacy_workspaces { + DEFAULT_LEGACY_WORKSPACE_FILTER_MODES + } else { + DEFAULT_FILTER_MODES + } + } else { + &self.0 + } + } } impl Default for Preview { @@ -409,17 +430,33 @@ impl Default for Daemon { impl Default for Search { fn default() -> Self { Self { - filters: vec![ - FilterMode::Global, - FilterMode::Host, - FilterMode::Session, - FilterMode::Workspace, - FilterMode::Directory, - ], + filters: EnabledFilterModes(vec![]), } } } +const DEFAULT_FILTER_MODES: &[FilterMode] = &[ + FilterMode::Global, + FilterMode::Host, + FilterMode::Session, + FilterMode::Workspace, + FilterMode::Directory, +]; + +const DEFAULT_LEGACY_WORKSPACE_FILTER_MODES: &[FilterMode] = &[ + FilterMode::Workspace, + FilterMode::Global, + FilterMode::Host, + FilterMode::Session, + FilterMode::Directory, +]; + +impl Default for EnabledFilterModes { + fn default() -> Self { + Self(DEFAULT_FILTER_MODES.into()) + } +} + // The preview height strategy also takes max_preview_height into account. #[derive(Clone, Debug, Deserialize, Copy, PartialEq, Eq, ValueEnum, Serialize)] pub enum PreviewStrategy { @@ -712,12 +749,21 @@ impl Settings { } pub fn default_filter_mode(&self) -> FilterMode { + if self.search.filters.specified().is_empty() && self.workspaces { + return FilterMode::Workspace; + } + + let filters = self.filter_modes(); self.filter_mode - .filter(|x| self.search.filters.contains(x)) - .or(self.search.filters.first().copied()) + .filter(|x| filters.contains(x)) + .or(filters.first().copied()) .unwrap_or(FilterMode::Global) } + pub fn filter_modes(&self) -> &[FilterMode] { + self.search.filters.resolved(self.workspaces) + } + #[cfg(not(feature = "check-update"))] pub async fn needs_update(&self) -> Option { None @@ -788,10 +834,6 @@ impl Settings { .set_default("daemon.socket_path", socket_path.to_str())? .set_default("daemon.systemd_socket", false)? .set_default("daemon.tcp_port", 8889)? - .set_default( - "search.filters", - vec!["global", "host", "session", "workspace", "directory"], - )? .set_default("theme.name", "default")? .set_default("theme.debug", None::)? .set_default( diff --git a/crates/atuin/src/command/client/search/engines.rs b/crates/atuin/src/command/client/search/engines.rs index 30a23cb2b0e..923e5a96500 100644 --- a/crates/atuin/src/command/client/search/engines.rs +++ b/crates/atuin/src/command/client/search/engines.rs @@ -26,15 +26,14 @@ pub struct SearchState { impl SearchState { pub(crate) fn rotate_filter_mode(&mut self, settings: &Settings, offset: isize) { - let mut i = settings - .search - .filters + let filters = settings.filter_modes(); + let mut i = filters .iter() .position(|&m| m == self.filter_mode) .unwrap_or_default(); - for _ in 0..settings.search.filters.len() { - i = (i.wrapping_add_signed(offset)) % settings.search.filters.len(); - let mode = settings.search.filters[i]; + for _ in 0..filters.len() { + i = (i.wrapping_add_signed(offset)) % filters.len(); + let mode = filters[i]; if self.filter_mode_available(mode, settings) { self.filter_mode = mode; break;