crate_activity/
fetch_usage.rs

1crate::ix!();
2
3// Fetch usage from the API or cache
4pub async fn fetch_usage(user_agent: &str, config_dir: &Path, crate_name: &str) 
5    -> Result<Option<CrateResponse>, reqwest::Error> 
6{
7    let today = Utc::now().date_naive();
8
9    if let Some(cached) = load_cached_response(config_dir,crate_name, today).await {
10        println!("Loaded cached data for {}", crate_name);
11        return Ok(Some(cached));
12    }
13
14    let url = format!("https://crates.io/api/v1/crates/{}/downloads", crate_name);
15    let client = Client::new();
16
17    let response = client
18        .get(&url)
19        .header("User-Agent", user_agent)
20        .send()
21        .await?;
22
23    if response.status().is_success() {
24        let body = response.text().await?;
25        if let Ok(usage) = serde_json::from_str::<CrateResponse>(&body) {
26            cache_response(&config_dir,crate_name, today, &usage).await.ok();
27            return Ok(Some(usage));
28        }
29    }
30    Ok(None)
31}