pub mod cache;
pub mod checker;
use std::time::{SystemTime, UNIX_EPOCH};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum VersionStatus {
UpdateAvailable { current: String, latest: String },
UpToDate,
Unknown,
}
pub async fn check_version(token: &str, current_version: &str) -> VersionStatus {
let cache_path = crate::github::cache::get_cache_path();
if let Some(cached) = cache::read_cached_version(&cache_path) {
if cache::is_cache_fresh(&cached) {
if let Some(dismissed) = cache::read_dismissed_version(&cache_path) {
if dismissed == cached.latest_version {
return VersionStatus::UpToDate; }
}
if checker::is_newer(current_version, &cached.latest_version) {
return VersionStatus::UpdateAvailable {
current: current_version.to_string(),
latest: cached.latest_version,
};
} else {
return VersionStatus::UpToDate;
}
}
}
let latest_version = match checker::fetch_latest_version(token).await {
Ok(version) => version,
Err(_) => return VersionStatus::Unknown, };
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs();
let cached_info = cache::CachedVersionInfo {
latest_version: latest_version.clone(),
checked_at: now,
};
let _ = cache::write_cached_version(&cache_path, &cached_info);
if let Some(dismissed) = cache::read_dismissed_version(&cache_path) {
if dismissed == latest_version {
return VersionStatus::UpToDate; }
}
if checker::is_newer(current_version, &latest_version) {
VersionStatus::UpdateAvailable {
current: current_version.to_string(),
latest: latest_version,
}
} else {
VersionStatus::UpToDate
}
}
pub fn dismiss_version(version: &str) {
let cache_path = crate::github::cache::get_cache_path();
let _ = cache::write_dismissed_version(&cache_path, version);
}
pub fn load_cached_status(current_version: &str) -> VersionStatus {
let cache_path = crate::github::cache::get_cache_path();
let cached = match cache::read_cached_version(&cache_path) {
Some(c) if cache::is_cache_fresh(&c) => c,
_ => return VersionStatus::Unknown,
};
if let Some(dismissed) = cache::read_dismissed_version(&cache_path) {
if dismissed == cached.latest_version {
return VersionStatus::UpToDate;
}
}
if checker::is_newer(current_version, &cached.latest_version) {
VersionStatus::UpdateAvailable {
current: current_version.to_string(),
latest: cached.latest_version,
}
} else {
VersionStatus::UpToDate
}
}