downlowd 0.1.1

Download files with automatic retries and resumes.
use std::sync::{Arc, Mutex};

use downlowd::ProgressHandle;

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProgressRecord {
    pub bytes: u64,
    pub total_bytes: Option<u64>,
}

#[derive(Clone)]
pub struct ProgressRecorder {
    records: Arc<Mutex<Vec<ProgressRecord>>>,
}

impl ProgressRecorder {
    pub fn new() -> Self {
        Self {
            records: Arc::new(Mutex::new(Vec::new())),
        }
    }

    pub fn record_progress(&self, progress: &mut ProgressHandle) {
        record_progress(self.records.clone(), progress);
    }

    pub fn on_progress(&self) -> impl Fn(&mut ProgressHandle) + Send + Sync + 'static {
        let records = self.records.clone();
        move |p| record_progress(records.clone(), p)
    }

    pub fn records(&self) -> Vec<ProgressRecord> {
        let records = self.records.lock().unwrap();
        records.clone()
    }
}

fn record_progress(records: Arc<Mutex<Vec<ProgressRecord>>>, progress: &mut ProgressHandle) {
    let mut records = records.lock().unwrap();
    records.push(ProgressRecord {
        bytes: progress.bytes(),
        total_bytes: progress.remote_length(),
    });
}