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, } #[tauri::command] pub async fn check_for_update(app: AppHandle) -> Result, 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) } }