downloader_rs/
download_operation.rs

1use std::sync::{Arc};
2use crate::download_status::DownloadStatus;
3use crate::download_receiver::DownloadReceiver;
4use crate::downloader::{Downloader};
5use crate::error::DownloadError;
6
7pub struct DownloadOperation {
8    downloader: Arc<Downloader>,
9    download_receiver: DownloadReceiver,
10}
11
12impl DownloadOperation {
13    pub fn new(
14        downloader: Arc<Downloader>,
15        download_receiver: DownloadReceiver) -> DownloadOperation {
16        DownloadOperation {
17            downloader,
18            download_receiver,
19        }
20    }
21
22    pub fn status(&self) -> DownloadStatus {
23        let status = self.downloader.status();
24        return status;
25    }
26
27    pub fn downloaded_size(&self) -> u64 {
28        return *self.download_receiver.downloaded_size_receiver.borrow();
29    }
30
31    pub fn total_size(&self) -> u64 {
32        return *self.download_receiver.download_total_size_receiver.borrow();
33    }
34
35    pub fn progress(&self) -> f64 {
36        let total_size = self.total_size();
37        if total_size == 0 {
38            return 0f64;
39        }
40        let total_length = total_size as f64;
41        let downloaded_size = self.downloaded_size() as f64;
42        return (downloaded_size / total_length).clamp(0f64, 1f64);
43    }
44
45    pub fn bytes(&self) -> Vec<u8> {
46        let bytes = self.download_receiver.memory_receiver.as_ref().unwrap().borrow();
47        bytes.to_vec()
48    }
49
50    pub fn is_done(&self) -> bool {
51        return self.downloader.is_done();
52    }
53
54    pub fn is_error(&self) -> bool {
55        return self.status() == DownloadStatus::Failed;
56    }
57
58    pub fn error(&self) -> DownloadError {
59        return (*self.download_receiver.error_receiver.borrow()).clone();
60    }
61
62    pub fn stop(&self) {
63        self.downloader.stop();
64    }
65}