diff --git a/tools/check_crate_updates/Cargo.toml b/tools/check_crate_updates/Cargo.toml index 41b44c93..f421adaa 100644 --- a/tools/check_crate_updates/Cargo.toml +++ b/tools/check_crate_updates/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] anyhow = "1.0.86" +cached = "0.52.0" semver = "1.0.23" serde = { version = "1.0.204", features = ["derive"] } serde_json = "1.0.120" diff --git a/tools/check_crate_updates/src/main.rs b/tools/check_crate_updates/src/main.rs index 67602b9d..fb2b7e36 100644 --- a/tools/check_crate_updates/src/main.rs +++ b/tools/check_crate_updates/src/main.rs @@ -1,4 +1,5 @@ use anyhow::anyhow; +use cached::proc_macro::cached; use std::{env, fs}; use table_extract::Table; use ureq::{Agent, AgentBuilder}; @@ -140,6 +141,12 @@ fn main() -> anyhow::Result<()> { Ok(()) } +#[cached( + result = true, + ty = "cached::SizedCache", + create = "{ cached::SizedCache::with_size(20) }", + convert = r#"{ name.to_string() }"# +)] fn fetch_crate(name: &str, agent: Agent) -> anyhow::Result { agent .get(&format!("https://crates.io/api/v1/crates/{name}")) @@ -149,6 +156,12 @@ fn fetch_crate(name: &str, agent: Agent) -> anyhow::Result { .map_err(|e| anyhow!("Failed to parse crate data for {name:?}\n{e}")) } +#[cached( + result = true, + ty = "cached::SizedCache", + create = "{ cached::SizedCache::with_size(20) }", + convert = r#"{ c.data.name.to_string() }"# +)] fn fetch_readme(c: &CrateResponse, agent: Agent) -> anyhow::Result { let path = &c.versions[0].readme_path; // index 0 is latest agent @@ -186,19 +199,19 @@ fn extract_versions_from_cell(input: &str) -> Vec { .collect() } -#[derive(serde::Deserialize)] +#[derive(serde::Deserialize, Clone)] struct CrateResponse { #[serde(rename = "crate")] data: CrateDataResponse, versions: Vec, } -#[derive(serde::Deserialize)] +#[derive(serde::Deserialize, Clone)] struct CrateDataResponse { name: String, } -#[derive(serde::Deserialize)] +#[derive(serde::Deserialize, Clone)] struct CrateVersionResponse { #[serde(rename = "num")] version: String,