crate_activity/
crate_activity_data.rs

1crate::ix!();
2
3#[derive(Debug, Getters)]
4pub struct CrateActivityData {
5
6    #[getset(get = "pub")]
7    summaries: Vec<CrateUsageSummary>,
8    
9    #[getset(get = "pub")]
10    interval_downloads_1d: HashMap<String, i64>,
11    
12    #[getset(get = "pub")]
13    interval_downloads_3d: HashMap<String, i64>,
14}
15
16pub async fn gather_crate_activity_data(
17    crate_names:    &[String],
18    user_agent:     &str,
19    config_dir:     &Path,
20    one_day_ago:    NaiveDate,
21    three_days_ago: NaiveDate,
22
23) -> Result<CrateActivityData, CrateActivityError> {
24
25    let mut summaries             = Vec::new();
26    let mut interval_downloads_1d = HashMap::new();
27    let mut interval_downloads_3d = HashMap::new();
28
29    for crate_name in crate_names {
30        match fetch_usage(user_agent, config_dir, crate_name).await {
31            Ok(Some(response)) => {
32                let summary = analyze_usage(crate_name, response.version_downloads().to_vec());
33                summaries.push(summary);
34
35                let downloads_last_1d: i64 = response
36                    .version_downloads()
37                    .iter()
38                    .filter(|d| *d.date() >= one_day_ago)
39                    .map(|d| d.downloads())
40                    .sum();
41
42                let downloads_last_3d: i64 = response
43                    .version_downloads()
44                    .iter()
45                    .filter(|d| *d.date() >= three_days_ago)
46                    .map(|d| d.downloads())
47                    .sum();
48
49                interval_downloads_1d.insert(crate_name.clone(), downloads_last_1d);
50                interval_downloads_3d.insert(crate_name.clone(), downloads_last_3d);
51            }
52            Ok(None) => {
53                eprintln!("No data for crate: {}", crate_name);
54            }
55            Err(e) => {
56                eprintln!("Failed to fetch data for {}: {:?}", crate_name, e);
57            }
58        }
59    }
60
61    Ok(CrateActivityData {
62        summaries,
63        interval_downloads_1d,
64        interval_downloads_3d,
65    })
66}