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    #[getset(get = "pub")]
16    interval_downloads_7d: HashMap<String, i64>,
17}
18
19pub async fn gather_crate_activity_data(
20    ignore_cache:   bool,
21    crate_names:    &[String],
22    user_agent:     &str,
23    config_dir:     &Path,
24    one_day_ago:    NaiveDate,
25    three_days_ago: NaiveDate,
26    seven_days_ago: NaiveDate,
27
28) -> Result<CrateActivityData, CrateActivityError> {
29
30    let mut summaries             = Vec::new();
31    let mut interval_downloads_1d = HashMap::new();
32    let mut interval_downloads_3d = HashMap::new();
33    let mut interval_downloads_7d = HashMap::new();
34
35    for crate_name in crate_names {
36        match fetch_usage(ignore_cache,user_agent, config_dir, crate_name).await {
37            Ok(Some(response)) => {
38                let summary = analyze_usage(crate_name, response.version_downloads().to_vec());
39                summaries.push(summary);
40
41                let downloads_last_1d: i64 = response
42                    .version_downloads()
43                    .iter()
44                    .filter(|d| *d.date() >= one_day_ago)
45                    .map(|d| d.downloads())
46                    .sum();
47
48                let downloads_last_3d: i64 = response
49                    .version_downloads()
50                    .iter()
51                    .filter(|d| *d.date() >= three_days_ago)
52                    .map(|d| d.downloads())
53                    .sum();
54
55                let downloads_last_7d: i64 = response
56                    .version_downloads()
57                    .iter()
58                    .filter(|d| *d.date() >= seven_days_ago)
59                    .map(|d| d.downloads())
60                    .sum();
61
62
63                interval_downloads_1d.insert(crate_name.clone(), downloads_last_1d);
64                interval_downloads_3d.insert(crate_name.clone(), downloads_last_3d);
65                interval_downloads_7d.insert(crate_name.clone(), downloads_last_7d);
66            }
67            Ok(None) => {
68                eprintln!("No data for crate: {}", crate_name);
69            }
70            Err(e) => {
71                eprintln!("Failed to fetch data for {}: {:?}", crate_name, e);
72            }
73        }
74    }
75
76    Ok(CrateActivityData {
77        summaries,
78        interval_downloads_1d,
79        interval_downloads_3d,
80        interval_downloads_7d,
81    })
82}