summaryrefslogtreecommitdiff
path: root/src/manager.rs
diff options
context:
space:
mode:
authorNaz <ndpm13@ch-naseem.com>2025-07-29 16:29:50 +0100
committerNaz <ndpm13@ch-naseem.com>2025-07-29 16:29:50 +0100
commitb5014598543533403fb11b570345790ff06d0cce (patch)
tree9d95b1f1caa5dec58aa2bdba53fddc274480882e /src/manager.rs
parent53cbca7ae6e3c1e37e59cafcd45efdba65c732ed (diff)
🔧refactor: replace old logic with new methods
Diffstat (limited to 'src/manager.rs')
-rw-r--r--src/manager.rs66
1 files changed, 27 insertions, 39 deletions
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<dyn std::error::Error>> {
- 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<dyn std::error::Error>> {
- 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<dyn std::error::Error>> {
+ 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(())
}