diff options
| author | Naz <ndpm13@ch-naseem.com> | 2025-07-29 13:46:43 +0100 |
|---|---|---|
| committer | Naz <ndpm13@ch-naseem.com> | 2025-07-29 13:46:43 +0100 |
| commit | bd8adb9f0193f1482ca866b06cf133ff68fd9a8e (patch) | |
| tree | 8d29230c9821e0512c207e2415e682a997090d2e /src/downloader.rs | |
| parent | f419a08d2861d76dce3d2a8206d6f1eb24bf1f2e (diff) | |
🔧refactor: remove types.rs
Diffstat (limited to 'src/downloader.rs')
| -rw-r--r-- | src/downloader.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/downloader.rs b/src/downloader.rs new file mode 100644 index 0000000..c40b0b4 --- /dev/null +++ b/src/downloader.rs @@ -0,0 +1,49 @@ +use futures_util::StreamExt; +use std::path::PathBuf; +use tokio::{fs, io::AsyncWriteExt}; + +use crate::{appimages_dir, make_progress_bar}; + +#[derive(Debug, Default)] +pub struct Downloader {} + +impl Downloader { + pub fn new() -> Self { + Self {} + } + pub async fn download_with_progress( + &self, + url: &str, + path: &PathBuf, + ) -> Result<(), Box<dyn std::error::Error>> { + fs::create_dir_all(&appimages_dir()).await?; + + let resp = reqwest::get(&url.to_string()).await?; + let total_size = resp.content_length().unwrap_or(0); + + let bar = make_progress_bar(total_size); + let mut out = tokio::fs::File::create(&path).await?; + + // Stream download with progress updates + let mut stream = resp.bytes_stream(); + while let Some(chunk) = stream.next().await { + let chunk = chunk?; + let len = chunk.len() as u64; + out.write_all(&chunk).await?; + bar.inc(len); + } + + bar.finish_with_message("Download complete!"); + + // Make executable + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + let mut perms = fs::metadata(&path).await?.permissions(); + perms.set_mode(0o755); + fs::set_permissions(&path, perms).await?; + } + + Ok(()) + } +} |
