summaryrefslogtreecommitdiff
path: root/src/manager.rs
blob: 9257fa7a1e51f64edfa41c373c92c299a277c64e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use tokio::fs;

use crate::{AppImage, Downloader, Index, SymlinkManager};

#[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(())
    }
}