diff --git a/core/src/document/manager.rs b/core/src/document/manager.rs index c17ac5d..29c7b0a 100644 --- a/core/src/document/manager.rs +++ b/core/src/document/manager.rs @@ -3,10 +3,10 @@ // // Document Manager – single entry point via SessionCommand. -use crate::document::command::SessionCommand; use crate::document::loader::{load_document, scan_directory_into}; -use crate::document::session::{CollectionKind, SessionData}; -use crate::document::store; +use crate::document::session::command::SessionCommand; +use crate::document::session::data::{CollectionKind, SessionData}; +use crate::document::session::store; use crate::document::DocumentContent; use crate::error::Error; use log::warn; @@ -38,6 +38,7 @@ impl Default for DocumentManager { } impl DocumentManager { + #[must_use] pub fn new() -> Self { Self::default() } @@ -87,11 +88,13 @@ impl DocumentManager { } /// Read-only access to a session by name. + #[must_use] pub fn session(&self, name: &str) -> Option<&SessionData> { self.sessions.iter().find(|s| s.name == name) } /// Read-only access to the active session. + #[must_use] pub fn active_session(&self) -> Option<&SessionData> { let name = self.active_session_name.as_deref()?; self.sessions.iter().find(|s| s.name == name) @@ -118,7 +121,7 @@ impl DocumentManager { fn open_session_file(&mut self, path: &Path) { match store::load_sessions(path) { Ok(mut loaded) => { - for session in loaded.iter_mut() { + for session in &mut loaded { match session.kind { CollectionKind::DirectoryBrowser => { if let Some(dir) = session.path.clone() { @@ -214,29 +217,23 @@ impl DocumentManager { source_index: usize, target_index: usize, ) { - let item = match self.session(source_name) { - Some(s) => match s.items.get(source_index) { + let item = if let Some(s) = self.session(source_name) { + match s.items.get(source_index) { Some(item) => item.clone(), None => return, - }, - None => { - self.state = DocumentState::Error(Error::Session(format!( - "Source session '{}' not found", - source_name - ))); - return; } + } else { + self.state = DocumentState::Error(Error::Session(format!( + "Source session '{source_name}' not found" + ))); + return; }; - let target = match self.session(target_name) { - Some(s) => s, - None => { - self.state = DocumentState::Error(Error::Session(format!( - "Target session '{}' not found", - target_name - ))); - return; - } + let Some(target) = self.session(target_name) else { + self.state = DocumentState::Error(Error::Session(format!( + "Target session '{target_name}' not found" + ))); + return; }; if target.kind != CollectionKind::DocumentCollection { @@ -262,18 +259,23 @@ impl DocumentManager { } fn remove_document(&mut self, index: usize) { - let session = match self.active_session_mut() { - Some(s) => s, + // Check kind before taking a mutable borrow on the session, so that + // self.state can be set without conflicting borrows. + match self.active_session().map(|s| s.kind.clone()) { None => return, - }; - - if session.kind != CollectionKind::DocumentCollection { - self.state = DocumentState::Error(Error::Session( - "Can only remove from a DocumentCollection".to_string(), - )); - return; + Some(CollectionKind::DirectoryBrowser) => { + self.state = DocumentState::Error(Error::Session( + "Can only remove from a DocumentCollection".to_string(), + )); + return; + } + Some(CollectionKind::DocumentCollection) => {} } + let Some(session) = self.active_session_mut() else { + return; + }; + if index >= session.items.len() { return; }