crate-activity 0.4.0

This crate provides a way to monitor the usage for a set of crates.io crates
Documentation
crate::ix!();

#[derive(Debug, Getters)]
pub struct CrateActivityData {

    #[getset(get = "pub")]
    summaries: Vec<CrateUsageSummary>,
    
    #[getset(get = "pub")]
    interval_downloads_1d: HashMap<String, i64>,
    
    #[getset(get = "pub")]
    interval_downloads_3d: HashMap<String, i64>,
}

pub async fn gather_crate_activity_data(
    crate_names:    &[String],
    user_agent:     &str,
    config_dir:     &Path,
    one_day_ago:    NaiveDate,
    three_days_ago: NaiveDate,

) -> Result<CrateActivityData, CrateActivityError> {

    let mut summaries             = Vec::new();
    let mut interval_downloads_1d = HashMap::new();
    let mut interval_downloads_3d = HashMap::new();

    for crate_name in crate_names {
        match fetch_usage(user_agent, config_dir, crate_name).await {
            Ok(Some(response)) => {
                let summary = analyze_usage(crate_name, response.version_downloads().to_vec());
                summaries.push(summary);

                let downloads_last_1d: i64 = response
                    .version_downloads()
                    .iter()
                    .filter(|d| *d.date() >= one_day_ago)
                    .map(|d| d.downloads())
                    .sum();

                let downloads_last_3d: i64 = response
                    .version_downloads()
                    .iter()
                    .filter(|d| *d.date() >= three_days_ago)
                    .map(|d| d.downloads())
                    .sum();

                interval_downloads_1d.insert(crate_name.clone(), downloads_last_1d);
                interval_downloads_3d.insert(crate_name.clone(), downloads_last_3d);
            }
            Ok(None) => {
                eprintln!("No data for crate: {}", crate_name);
            }
            Err(e) => {
                eprintln!("Failed to fetch data for {}: {:?}", crate_name, e);
            }
        }
    }

    Ok(CrateActivityData {
        summaries,
        interval_downloads_1d,
        interval_downloads_3d,
    })
}