pr_bro/version_check/
mod.rs1pub mod cache;
2pub mod checker;
3
4use std::time::{SystemTime, UNIX_EPOCH};
5
6#[derive(Debug, Clone, PartialEq, Eq)]
8pub enum VersionStatus {
9 UpdateAvailable { current: String, latest: String },
11 UpToDate,
13 Unknown,
15}
16
17pub async fn check_version(token: &str, current_version: &str) -> VersionStatus {
23 let cache_path = crate::github::cache::get_cache_path();
24
25 if let Some(cached) = cache::read_cached_version(&cache_path) {
27 if cache::is_cache_fresh(&cached) {
28 if let Some(dismissed) = cache::read_dismissed_version(&cache_path) {
30 if dismissed == cached.latest_version {
31 return VersionStatus::UpToDate; }
33 }
34
35 if checker::is_newer(current_version, &cached.latest_version) {
37 return VersionStatus::UpdateAvailable {
38 current: current_version.to_string(),
39 latest: cached.latest_version,
40 };
41 } else {
42 return VersionStatus::UpToDate;
43 }
44 }
45 }
46
47 let latest_version = match checker::fetch_latest_version(token).await {
49 Ok(version) => version,
50 Err(_) => return VersionStatus::Unknown, };
52
53 let now = SystemTime::now()
55 .duration_since(UNIX_EPOCH)
56 .unwrap()
57 .as_secs();
58
59 let cached_info = cache::CachedVersionInfo {
60 latest_version: latest_version.clone(),
61 checked_at: now,
62 };
63
64 let _ = cache::write_cached_version(&cache_path, &cached_info);
66
67 if let Some(dismissed) = cache::read_dismissed_version(&cache_path) {
69 if dismissed == latest_version {
70 return VersionStatus::UpToDate; }
72 }
73
74 if checker::is_newer(current_version, &latest_version) {
76 VersionStatus::UpdateAvailable {
77 current: current_version.to_string(),
78 latest: latest_version,
79 }
80 } else {
81 VersionStatus::UpToDate
82 }
83}
84
85pub fn dismiss_version(version: &str) {
87 let cache_path = crate::github::cache::get_cache_path();
88 let _ = cache::write_dismissed_version(&cache_path, version);
90}
91
92pub fn load_cached_status(current_version: &str) -> VersionStatus {
97 let cache_path = crate::github::cache::get_cache_path();
98
99 let cached = match cache::read_cached_version(&cache_path) {
100 Some(c) if cache::is_cache_fresh(&c) => c,
101 _ => return VersionStatus::Unknown,
102 };
103
104 if let Some(dismissed) = cache::read_dismissed_version(&cache_path) {
106 if dismissed == cached.latest_version {
107 return VersionStatus::UpToDate;
108 }
109 }
110
111 if checker::is_newer(current_version, &cached.latest_version) {
113 VersionStatus::UpdateAvailable {
114 current: current_version.to_string(),
115 latest: cached.latest_version,
116 }
117 } else {
118 VersionStatus::UpToDate
119 }
120}