From fc2d89892cf9e740684a93ae6cc302f15e30eb2f Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Sat, 21 Feb 2026 19:14:45 +0300 Subject: [PATCH] model/lockfile: revert `get_project` to O(n) linear scan; remove unused project index Signed-off-by: NotAShelf Change-Id: I3a35ab4ce5dec8ce95a736440fa293fe6a6a6964 --- src/model/lockfile.rs | 109 +++++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 48 deletions(-) diff --git a/src/model/lockfile.rs b/src/model/lockfile.rs index dcda70d..eb0a64b 100644 --- a/src/model/lockfile.rs +++ b/src/model/lockfile.rs @@ -578,6 +578,67 @@ pub struct LockFile { pub lockfile_version: u32, } +impl LockFile { + pub fn new( + target: Option, + mc_versions: Vec, + loaders: HashMap, + ) -> Self { + Self { + target, + mc_versions, + loaders, + projects: Vec::new(), + lockfile_version: LOCKFILE_VERSION, + } + } + + pub fn get_project(&self, pakku_id: &str) -> Option<&Project> { + self + .projects + .iter() + .find(|p| p.pakku_id.as_deref() == Some(pakku_id)) + } + + pub fn get_loader_names(&self) -> Vec { + self.loaders.keys().cloned().collect() + } + + pub fn remove_project(&mut self, pakku_id: &str) -> Option { + if let Some(pos) = self + .projects + .iter() + .position(|p| p.pakku_id.as_deref() == Some(pakku_id)) + { + Some(self.projects.remove(pos)) + } else { + None + } + } + + pub fn find_project(&self, pakku_id: &str) -> Option<&Project> { + self.get_project(pakku_id) + } + + pub fn find_project_mut(&mut self, pakku_id: &str) -> Option<&mut Project> { + self + .projects + .iter_mut() + .find(|p| p.pakku_id.as_deref() == Some(pakku_id)) + } + + pub fn find_project_by_platform_id( + &self, + platform: &str, + id: &str, + ) -> Option<&Project> { + self + .projects + .iter() + .find(|p| p.id.get(platform).is_some_and(|pid| pid == id)) + } +} + impl LockFile { pub fn load>(path: P) -> Result { Self::load_with_validation(path, true) @@ -720,52 +781,4 @@ impl LockFile { self.projects.push(project); self.projects.sort_by_key(super::project::Project::get_name); } - - pub fn get_project(&self, pakku_id: &str) -> Option<&Project> { - self - .projects - .iter() - .find(|p| p.pakku_id.as_deref() == Some(pakku_id)) - } - - pub fn get_loader_names(&self) -> Vec { - self.loaders.keys().cloned().collect() - } - - pub fn remove_project(&mut self, pakku_id: &str) -> Option { - if let Some(pos) = self - .projects - .iter() - .position(|p| p.pakku_id.as_deref() == Some(pakku_id)) - { - Some(self.projects.remove(pos)) - } else { - None - } - } - - pub fn find_project(&self, pakku_id: &str) -> Option<&Project> { - self - .projects - .iter() - .find(|p| p.pakku_id.as_deref() == Some(pakku_id)) - } - - pub fn find_project_mut(&mut self, pakku_id: &str) -> Option<&mut Project> { - self - .projects - .iter_mut() - .find(|p| p.pakku_id.as_deref() == Some(pakku_id)) - } - - pub fn find_project_by_platform_id( - &self, - platform: &str, - id: &str, - ) -> Option<&Project> { - self - .projects - .iter() - .find(|p| p.id.get(platform).is_some_and(|pid| pid == id)) - } }