From bd8adb9f0193f1482ca866b06cf133ff68fd9a8e Mon Sep 17 00:00:00 2001 From: Naz Date: Tue, 29 Jul 2025 13:46:43 +0100 Subject: =?UTF-8?q?=F0=9F=94=A7refactor:=20remove=20types.rs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/manager.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/manager.rs (limited to 'src/manager.rs') diff --git a/src/manager.rs b/src/manager.rs new file mode 100644 index 0000000..e810bda --- /dev/null +++ b/src/manager.rs @@ -0,0 +1,61 @@ +use std::path::PathBuf; + +use tokio::fs; + +use crate::{AppImage, Downloader, Index, SymlinkManager, appimages_dir, index_dir}; + +#[derive(Debug)] +pub struct PackageManager { + pub downloader: Downloader, + pub index: Index, + pub symlink_manager: SymlinkManager, +} + +impl PackageManager { + pub async fn install( + appimage: &AppImage, + appname: &str, + ) -> Result<(), Box> { + if index_dir() + .join(format!("{}.json", &appimage.executable)) + .exists() + { + Err(format!("{} is already installed.", &appimage.executable).into()) + } else { + // Try to extract filename from URL or use default + let url = &appimage.source.meta.url; + let filename = match url.split('/').next_back() { + Some(name) => name.to_string(), + None => format!("{}.AppImage", appimage.executable), + }; + let path = &appimages_dir().join(filename); + + let downloader = crate::Downloader::new(); + downloader.download_with_progress(url, path).await?; + + let index = crate::Index::new(); + index.add(appimage, appname).await?; + + let sm = crate::SymlinkManager::new(); + sm.create(appimage).await?; + Ok(()) + } + } + pub async fn remove(appname: &str) -> Result<(), Box> { + let index_file_path = index_dir().join(format!("{appname}.json")); + let index_file_content = fs::read_to_string(&index_file_path).await?; + let appimage: AppImage = serde_json::from_str(&index_file_content)?; + + let home = std::env::var("HOME")?; + let symlink_path = PathBuf::from(home) + .join(".local/bin") + .join(&appimage.executable); + let index_path = index_dir().join(format!("{}.json", &appimage.executable)); + + fs::remove_file(&appimage.file_path).await?; + fs::remove_file(symlink_path).await?; + fs::remove_file(index_path).await?; + + Ok(()) + } +} -- cgit v1.2.3 From b5014598543533403fb11b570345790ff06d0cce Mon Sep 17 00:00:00 2001 From: Naz Date: Tue, 29 Jul 2025 16:29:50 +0100 Subject: =?UTF-8?q?=F0=9F=94=A7refactor:=20replace=20old=20logic=20with=20?= =?UTF-8?q?new=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/manager.rs | 66 ++++++++++++++++++++++++---------------------------------- 1 file changed, 27 insertions(+), 39 deletions(-) (limited to 'src/manager.rs') diff --git a/src/manager.rs b/src/manager.rs index e810bda..9257fa7 100644 --- a/src/manager.rs +++ b/src/manager.rs @@ -1,10 +1,8 @@ -use std::path::PathBuf; - use tokio::fs; -use crate::{AppImage, Downloader, Index, SymlinkManager, appimages_dir, index_dir}; +use crate::{AppImage, Downloader, Index, SymlinkManager}; -#[derive(Debug)] +#[derive(Debug, Default)] pub struct PackageManager { pub downloader: Downloader, pub index: Index, @@ -12,49 +10,39 @@ pub struct PackageManager { } impl PackageManager { + pub fn new() -> Self { + Self { + downloader: Downloader::new(), + index: Index::new(), + symlink_manager: SymlinkManager::new(), + } + } pub async fn install( - appimage: &AppImage, + &self, + appimage: &mut AppImage, appname: &str, ) -> Result<(), Box> { - if index_dir() - .join(format!("{}.json", &appimage.executable)) - .exists() - { - Err(format!("{} is already installed.", &appimage.executable).into()) - } else { - // Try to extract filename from URL or use default - let url = &appimage.source.meta.url; - let filename = match url.split('/').next_back() { - Some(name) => name.to_string(), - None => format!("{}.AppImage", appimage.executable), - }; - let path = &appimages_dir().join(filename); - - let downloader = crate::Downloader::new(); - downloader.download_with_progress(url, path).await?; + if self.index.exists(&appimage.executable) { + return Err(format!("{} is already installed.", &appimage.executable).into()); + } - let index = crate::Index::new(); - index.add(appimage, appname).await?; + appimage.file_path = self + .downloader + .prepare_path(&appimage.source.meta.url, &appimage.executable); + self.downloader + .download_with_progress(&appimage.source.meta.url, &appimage.file_path) + .await?; - let sm = crate::SymlinkManager::new(); - sm.create(appimage).await?; - Ok(()) - } + self.index.add(appimage, appname).await?; + self.symlink_manager.create(appimage).await?; + Ok(()) } - pub async fn remove(appname: &str) -> Result<(), Box> { - let index_file_path = index_dir().join(format!("{appname}.json")); - let index_file_content = fs::read_to_string(&index_file_path).await?; - let appimage: AppImage = serde_json::from_str(&index_file_content)?; - - let home = std::env::var("HOME")?; - let symlink_path = PathBuf::from(home) - .join(".local/bin") - .join(&appimage.executable); - let index_path = index_dir().join(format!("{}.json", &appimage.executable)); + pub async fn remove(&self, appname: &str) -> Result<(), Box> { + let appimage = self.index.get(appname).await?; fs::remove_file(&appimage.file_path).await?; - fs::remove_file(symlink_path).await?; - fs::remove_file(index_path).await?; + self.symlink_manager.remove(&appimage.executable).await?; + self.index.remove(appname).await?; Ok(()) } -- cgit v1.2.3 From 11a86042e73bb0eecad61ac6e636dd98563167f5 Mon Sep 17 00:00:00 2001 From: Naz Date: Wed, 30 Jul 2025 07:09:37 +0100 Subject: =?UTF-8?q?=F0=9F=94=A7refactor:=20move=20the=20list=20logic=20to?= =?UTF-8?q?=20PackageManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/manager.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/manager.rs') diff --git a/src/manager.rs b/src/manager.rs index 9257fa7..2c75900 100644 --- a/src/manager.rs +++ b/src/manager.rs @@ -1,6 +1,6 @@ use tokio::fs; -use crate::{AppImage, Downloader, Index, SymlinkManager}; +use crate::{AppImage, Downloader, Index, SymlinkManager, index_dir}; #[derive(Debug, Default)] pub struct PackageManager { @@ -44,6 +44,17 @@ impl PackageManager { self.symlink_manager.remove(&appimage.executable).await?; self.index.remove(appname).await?; + Ok(()) + } + pub async fn list(&self) -> Result<(), Box> { + let mut appimages = fs::read_dir(index_dir()).await?; + + while let Some(appimage) = appimages.next_entry().await? { + if let Some(name) = appimage.file_name().to_str() { + println!("- {}", name.strip_suffix(".json").unwrap()); + } + } + Ok(()) } } -- cgit v1.2.3