use std::time::Duration;
use serde::Deserialize;
use crate::crate_info;
#[derive(Deserialize)]
struct CratesIoResponse {
#[serde(rename = "crate")]
crate_info: CrateInfo,
}
#[derive(Deserialize)]
struct CrateInfo {
max_stable_version: Option<semver::Version>,
}
pub async fn check_for_newer_version() -> color_eyre::Result<Option<semver::Version>> {
const CRATES_IO_API: &str = "https://crates.io/api/v1/crates";
const REQUEST_TIMEOUT_SECS: Duration = Duration::from_secs(5);
let current = semver::Version::parse(crate_info::version())?;
let url = format!("{CRATES_IO_API}/{}", crate_info::name());
let client = reqwest::Client::builder()
.timeout(REQUEST_TIMEOUT_SECS)
.user_agent(crate_info::name())
.build()?;
let response = client.get(&url).send().await?;
let crates_info: CratesIoResponse = response.json().await?;
Ok(crates_info
.crate_info
.max_stable_version
.filter(|latest| latest > ¤t))
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_check_for_newer_version() {
let _result = check_for_newer_version().await;
}
}