crate_activity/
crate_activity_data.rs1crate::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}