58 lines
1.7 KiB
Rust
58 lines
1.7 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
use tauri::AppHandle;
|
|
|
|
const UPDATE_URL: &str =
|
|
"https://git.racooncity.org/api/v1/repos/mysticmomba/argus/releases/latest";
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct UpdateInfo {
|
|
pub version: String,
|
|
pub url: String,
|
|
pub notes: Option<String>,
|
|
}
|
|
|
|
#[tauri::command]
|
|
pub async fn check_for_update(app: AppHandle) -> Result<Option<UpdateInfo>, String> {
|
|
let response = reqwest::get(UPDATE_URL)
|
|
.await
|
|
.map_err(|e| format!("Failed to check for updates: {}", e))?;
|
|
|
|
if !response.status().is_success() {
|
|
return Err(format!("Update server returned {}", response.status()));
|
|
}
|
|
|
|
let body: serde_json::Value = response
|
|
.json()
|
|
.await
|
|
.map_err(|e| format!("Invalid update response: {}", e))?;
|
|
|
|
let tag = body["tag_name"]
|
|
.as_str()
|
|
.ok_or_else(|| "No tag_name in response".to_string())?;
|
|
|
|
let html_url = body["html_url"].as_str().unwrap_or("").to_string();
|
|
|
|
let notes = body["body"]
|
|
.as_str()
|
|
.map(|s| s.to_string())
|
|
.filter(|s| !s.is_empty());
|
|
|
|
let remote_version = tag.strip_prefix('v').unwrap_or(tag);
|
|
let current = app.package_info().version.to_string();
|
|
|
|
let remote_semver = semver::Version::parse(remote_version)
|
|
.map_err(|e| format!("Invalid remote version '{}': {}", remote_version, e))?;
|
|
let current_semver = semver::Version::parse(¤t)
|
|
.map_err(|e| format!("Invalid current version '{}': {}", current, e))?;
|
|
|
|
if remote_semver > current_semver {
|
|
Ok(Some(UpdateInfo {
|
|
version: remote_version.to_string(),
|
|
url: html_url,
|
|
notes,
|
|
}))
|
|
} else {
|
|
Ok(None)
|
|
}
|
|
}
|