summaryrefslogtreecommitdiff
path: root/src/manager.rs
diff options
context:
space:
mode:
authorNaz <ndpm13@ch-naseem.com>2025-07-30 07:11:24 +0100
committerNaz <ndpm13@ch-naseem.com>2025-07-30 07:11:24 +0100
commitdf40ab0fd7d9641297833dc7e0691522c25e2bc9 (patch)
treeb185168ceedb4f71b255e7e61a365566da41538d /src/manager.rs
parentd3c84b04d7a46735dd19a2dae9448e811a609291 (diff)
parent11a86042e73bb0eecad61ac6e636dd98563167f5 (diff)
Merge pull request '🔧refactor: separate download logic from AppImage struct' (#11) from feat/issue-7 into main
Reviewed-on: https://git.ch-naseem.com/ndpm13/zap-rs/pulls/11
Diffstat (limited to 'src/manager.rs')
-rw-r--r--src/manager.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/manager.rs b/src/manager.rs
new file mode 100644
index 0000000..2c75900
--- /dev/null
+++ b/src/manager.rs
@@ -0,0 +1,60 @@
+use tokio::fs;
+
+use crate::{AppImage, Downloader, Index, SymlinkManager, index_dir};
+
+#[derive(Debug, Default)]
+pub struct PackageManager {
+ pub downloader: Downloader,
+ pub index: Index,
+ pub symlink_manager: SymlinkManager,
+}
+
+impl PackageManager {
+ pub fn new() -> Self {
+ Self {
+ downloader: Downloader::new(),
+ index: Index::new(),
+ symlink_manager: SymlinkManager::new(),
+ }
+ }
+ pub async fn install(
+ &self,
+ appimage: &mut AppImage,
+ appname: &str,
+ ) -> Result<(), Box<dyn std::error::Error>> {
+ if self.index.exists(&appimage.executable) {
+ return Err(format!("{} is already installed.", &appimage.executable).into());
+ }
+
+ 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?;
+
+ self.index.add(appimage, appname).await?;
+ self.symlink_manager.create(appimage).await?;
+ Ok(())
+ }
+ 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?;
+ self.symlink_manager.remove(&appimage.executable).await?;
+ self.index.remove(appname).await?;
+
+ Ok(())
+ }
+ pub async fn list(&self) -> Result<(), Box<dyn std::error::Error>> {
+ 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(())
+ }
+}