crate_activity/
fetch_usage.rs

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