pr_bro/version_check/
cache.rs1use anyhow::Result;
2use serde::{Deserialize, Serialize};
3use std::path::Path;
4use std::time::{SystemTime, UNIX_EPOCH};
5
6const VERSION_CHECK_CACHE_KEY: &str = "version-check:latest";
7const DISMISSED_VERSION_CACHE_KEY: &str = "version-check:dismissed";
8const CACHE_TTL_SECONDS: u64 = 86400; #[derive(Debug, Serialize, Deserialize)]
12pub struct CachedVersionInfo {
13 pub latest_version: String,
14 pub checked_at: u64, }
16
17#[derive(Debug, Serialize, Deserialize)]
19struct DismissedVersion {
20 version: String,
21}
22
23pub fn read_cached_version(cache_path: &Path) -> Option<CachedVersionInfo> {
25 let bytes = cacache::read_sync(cache_path, VERSION_CHECK_CACHE_KEY).ok()?;
26 serde_json::from_slice(&bytes).ok()
27}
28
29pub fn write_cached_version(cache_path: &Path, info: &CachedVersionInfo) -> Result<()> {
31 let json = serde_json::to_vec(info)?;
32 cacache::write_sync(cache_path, VERSION_CHECK_CACHE_KEY, &json)?;
33 Ok(())
34}
35
36pub fn is_cache_fresh(info: &CachedVersionInfo) -> bool {
38 let now = SystemTime::now()
39 .duration_since(UNIX_EPOCH)
40 .unwrap()
41 .as_secs();
42
43 now - info.checked_at < CACHE_TTL_SECONDS
44}
45
46pub fn read_dismissed_version(cache_path: &Path) -> Option<String> {
48 let bytes = cacache::read_sync(cache_path, DISMISSED_VERSION_CACHE_KEY).ok()?;
49 let dismissed: DismissedVersion = serde_json::from_slice(&bytes).ok()?;
50 Some(dismissed.version)
51}
52
53pub fn write_dismissed_version(cache_path: &Path, version: &str) -> Result<()> {
55 let dismissed = DismissedVersion {
56 version: version.to_string(),
57 };
58 let json = serde_json::to_vec(&dismissed)?;
59 cacache::write_sync(cache_path, DISMISSED_VERSION_CACHE_KEY, &json)?;
60 Ok(())
61}