Skip to main content

pr_bro/version_check/
cache.rs

1use 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; // 24 hours
9
10/// Cached version information with timestamp
11#[derive(Debug, Serialize, Deserialize)]
12pub struct CachedVersionInfo {
13    pub latest_version: String,
14    pub checked_at: u64, // Unix timestamp
15}
16
17/// Dismissed version tracking
18#[derive(Debug, Serialize, Deserialize)]
19struct DismissedVersion {
20    version: String,
21}
22
23/// Read cached version info from disk
24pub 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
29/// Write version info to cache
30pub 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
36/// Check if cached version info is still fresh (within 24h)
37pub 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
46/// Read dismissed version from cache
47pub 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
53/// Write dismissed version to cache
54pub 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}