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 #[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}