diff options
Diffstat (limited to 'src/manager.rs')
| -rw-r--r-- | src/manager.rs | 60 |
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(()) + } +} |
