diff options
Diffstat (limited to 'src-tauri')
| -rw-r--r-- | src-tauri/src/core/java/mod.rs | 161 | ||||
| -rw-r--r-- | src-tauri/src/core/java/priority.rs | 76 | ||||
| -rw-r--r-- | src-tauri/src/core/java/providers/adoptium.rs | 22 | ||||
| -rw-r--r-- | src-tauri/src/core/java/validation.rs | 30 | ||||
| -rw-r--r-- | src-tauri/src/main.rs | 1 |
5 files changed, 152 insertions, 138 deletions
diff --git a/src-tauri/src/core/java/mod.rs b/src-tauri/src/core/java/mod.rs index c88cd1c..770ba08 100644 --- a/src-tauri/src/core/java/mod.rs +++ b/src-tauri/src/core/java/mod.rs @@ -3,11 +3,14 @@ use std::path::PathBuf; use tauri::{AppHandle, Emitter, Manager}; pub mod detection; +pub mod error; pub mod persistence; pub mod priority; -pub mod validation; pub mod provider; pub mod providers; +pub mod validation; + +pub use error::JavaError; /// Remove the UNC prefix (\\?\) from Windows paths pub fn strip_unc_prefix(path: PathBuf) -> PathBuf { @@ -94,8 +97,6 @@ pub struct JavaDownloadInfo { pub image_type: String, // "jre" or "jdk" } - - pub fn get_java_install_dir(app_handle: &AppHandle) -> PathBuf { app_handle.path().app_data_dir().unwrap().join("java") } @@ -153,7 +154,10 @@ pub async fn fetch_java_catalog( force_refresh: bool, ) -> Result<JavaCatalog, String> { let provider = AdoptiumProvider::new(); - provider.fetch_catalog(app_handle, force_refresh).await + provider + .fetch_catalog(app_handle, force_refresh) + .await + .map_err(|e| e.to_string()) } pub async fn fetch_java_release( @@ -161,12 +165,18 @@ pub async fn fetch_java_release( image_type: ImageType, ) -> Result<JavaDownloadInfo, String> { let provider = AdoptiumProvider::new(); - provider.fetch_release(major_version, image_type).await + provider + .fetch_release(major_version, image_type) + .await + .map_err(|e| e.to_string()) } pub async fn fetch_available_versions() -> Result<Vec<u32>, String> { let provider = AdoptiumProvider::new(); - provider.available_versions().await + provider + .available_versions() + .await + .map_err(|e| e.to_string()) } pub async fn download_and_install_java( @@ -180,7 +190,12 @@ pub async fn download_and_install_java( let file_name = info.file_name.clone(); let install_base = custom_path.unwrap_or_else(|| get_java_install_dir(app_handle)); - let version_dir = install_base.join(format!("{}-{}-{}", provider.install_prefix(), major_version, image_type)); + let version_dir = install_base.join(format!( + "{}-{}-{}", + provider.install_prefix(), + major_version, + image_type + )); std::fs::create_dir_all(&install_base) .map_err(|e| format!("Failed to create installation directory: {}", e))?; @@ -319,48 +334,48 @@ fn find_top_level_dir(extract_dir: &PathBuf) -> Result<String, String> { } pub async fn detect_java_installations() -> Vec<JavaInstallation> { - let mut installations = Vec::new(); - let candidates = detection::get_java_candidates(); - - for candidate in candidates { - if let Some(java) = validation::check_java_installation(&candidate).await { - if !installations - .iter() - .any(|j: &JavaInstallation| j.path == java.path) - { - installations.push(java); - } - } - } - - installations.sort_by(|a, b| { - let v_a = validation::parse_java_version(&a.version); - let v_b = validation::parse_java_version(&b.version); - v_b.cmp(&v_a) - }); - - installations + let mut installations = Vec::new(); + let candidates = detection::get_java_candidates(); + + for candidate in candidates { + if let Some(java) = validation::check_java_installation(&candidate).await { + if !installations + .iter() + .any(|j: &JavaInstallation| j.path == java.path) + { + installations.push(java); + } + } + } + + installations.sort_by(|a, b| { + let v_a = validation::parse_java_version(&a.version); + let v_b = validation::parse_java_version(&b.version); + v_b.cmp(&v_a) + }); + + installations } pub async fn get_recommended_java(required_major_version: Option<u64>) -> Option<JavaInstallation> { - let installations = detect_java_installations().await; - - if let Some(required) = required_major_version { - installations.into_iter().find(|java| { - let major = validation::parse_java_version(&java.version); - major >= required as u32 - }) - } else { - installations.into_iter().next() - } + let installations = detect_java_installations().await; + + if let Some(required) = required_major_version { + installations.into_iter().find(|java| { + let major = validation::parse_java_version(&java.version); + major >= required as u32 + }) + } else { + installations.into_iter().next() + } } pub async fn get_compatible_java( - app_handle: &AppHandle, - required_major_version: Option<u64>, - max_major_version: Option<u32>, + app_handle: &AppHandle, + required_major_version: Option<u64>, + max_major_version: Option<u32>, ) -> Option<JavaInstallation> { - let installations = detect_all_java_installations(app_handle).await; + let installations = detect_all_java_installations(app_handle).await; installations.into_iter().find(|java| { let major = validation::parse_java_version(&java.version); @@ -369,9 +384,9 @@ pub async fn get_compatible_java( } pub async fn is_java_compatible( - java_path: &str, - required_major_version: Option<u64>, - max_major_version: Option<u32>, + java_path: &str, + required_major_version: Option<u64>, + max_major_version: Option<u32>, ) -> bool { let java_path_buf = PathBuf::from(java_path); if let Some(java) = validation::check_java_installation(&java_path_buf).await { @@ -383,34 +398,34 @@ pub async fn is_java_compatible( } pub async fn detect_all_java_installations(app_handle: &AppHandle) -> Vec<JavaInstallation> { - let mut installations = detect_java_installations().await; - - let dropout_java_dir = get_java_install_dir(app_handle); - if dropout_java_dir.exists() { - if let Ok(entries) = std::fs::read_dir(&dropout_java_dir) { - for entry in entries.flatten() { - let path = entry.path(); - if path.is_dir() { - let java_bin = find_java_executable(&path); - if let Some(java_path) = java_bin { - if let Some(java) = validation::check_java_installation(&java_path).await { - if !installations.iter().any(|j| j.path == java.path) { - installations.push(java); - } - } - } - } - } - } - } - - installations.sort_by(|a, b| { - let v_a = validation::parse_java_version(&a.version); - let v_b = validation::parse_java_version(&b.version); - v_b.cmp(&v_a) - }); - - installations + let mut installations = detect_java_installations().await; + + let dropout_java_dir = get_java_install_dir(app_handle); + if dropout_java_dir.exists() { + if let Ok(entries) = std::fs::read_dir(&dropout_java_dir) { + for entry in entries.flatten() { + let path = entry.path(); + if path.is_dir() { + let java_bin = find_java_executable(&path); + if let Some(java_path) = java_bin { + if let Some(java) = validation::check_java_installation(&java_path).await { + if !installations.iter().any(|j| j.path == java.path) { + installations.push(java); + } + } + } + } + } + } + } + + installations.sort_by(|a, b| { + let v_a = validation::parse_java_version(&a.version); + let v_b = validation::parse_java_version(&b.version); + v_b.cmp(&v_a) + }); + + installations } fn find_java_executable(dir: &PathBuf) -> Option<PathBuf> { diff --git a/src-tauri/src/core/java/priority.rs b/src-tauri/src/core/java/priority.rs index 09a61b3..e456680 100644 --- a/src-tauri/src/core/java/priority.rs +++ b/src-tauri/src/core/java/priority.rs @@ -5,48 +5,48 @@ use crate::core::java::persistence; use crate::core::java::validation; pub async fn resolve_java_for_launch( - app_handle: &AppHandle, - instance_java_override: Option<&str>, - global_java_path: Option<&str>, - required_major_version: Option<u64>, - max_major_version: Option<u32>, + app_handle: &AppHandle, + instance_java_override: Option<&str>, + global_java_path: Option<&str>, + required_major_version: Option<u64>, + max_major_version: Option<u32>, ) -> Option<JavaInstallation> { - if let Some(override_path) = instance_java_override { - if !override_path.is_empty() { - let path_buf = std::path::PathBuf::from(override_path); - if let Some(java) = validation::check_java_installation(&path_buf).await { - if is_version_compatible(&java, required_major_version, max_major_version) { - return Some(java); - } - } - } - } + if let Some(override_path) = instance_java_override { + if !override_path.is_empty() { + let path_buf = std::path::PathBuf::from(override_path); + if let Some(java) = validation::check_java_installation(&path_buf).await { + if is_version_compatible(&java, required_major_version, max_major_version) { + return Some(java); + } + } + } + } - if let Some(global_path) = global_java_path { - if !global_path.is_empty() { - let path_buf = std::path::PathBuf::from(global_path); - if let Some(java) = validation::check_java_installation(&path_buf).await { - if is_version_compatible(&java, required_major_version, max_major_version) { - return Some(java); - } - } - } - } + if let Some(global_path) = global_java_path { + if !global_path.is_empty() { + let path_buf = std::path::PathBuf::from(global_path); + if let Some(java) = validation::check_java_installation(&path_buf).await { + if is_version_compatible(&java, required_major_version, max_major_version) { + return Some(java); + } + } + } + } - let preferred = persistence::get_preferred_java_path(app_handle); - if let Some(pref_path) = preferred { - let path_buf = std::path::PathBuf::from(&pref_path); - if let Some(java) = validation::check_java_installation(&path_buf).await { - if is_version_compatible(&java, required_major_version, max_major_version) { - return Some(java); - } - } - } + let preferred = persistence::get_preferred_java_path(app_handle); + if let Some(pref_path) = preferred { + let path_buf = std::path::PathBuf::from(&pref_path); + if let Some(java) = validation::check_java_installation(&path_buf).await { + if is_version_compatible(&java, required_major_version, max_major_version) { + return Some(java); + } + } + } - let installations = super::detect_all_java_installations(app_handle).await; - installations - .into_iter() - .find(|java| is_version_compatible(java, required_major_version, max_major_version)) + let installations = super::detect_all_java_installations(app_handle).await; + installations + .into_iter() + .find(|java| is_version_compatible(java, required_major_version, max_major_version)) } fn is_version_compatible( diff --git a/src-tauri/src/core/java/providers/adoptium.rs b/src-tauri/src/core/java/providers/adoptium.rs index 40e1757..a73a0f6 100644 --- a/src-tauri/src/core/java/providers/adoptium.rs +++ b/src-tauri/src/core/java/providers/adoptium.rs @@ -1,5 +1,6 @@ use crate::core::java::error::JavaError; use crate::core::java::provider::JavaProvider; +use crate::core::java::save_catalog_cache; use crate::core::java::{ImageType, JavaCatalog, JavaDownloadInfo, JavaReleaseInfo}; use serde::Deserialize; use tauri::AppHandle; @@ -72,7 +73,7 @@ impl JavaProvider for AdoptiumProvider { force_refresh: bool, ) -> Result<JavaCatalog, JavaError> { if !force_refresh { - if let Ok(Some(cached)) = crate::core::java::load_cached_catalog(app_handle) { + if let Some(cached) = crate::core::java::load_cached_catalog(app_handle) { return Ok(cached); } } @@ -90,7 +91,7 @@ impl JavaProvider for AdoptiumProvider { .map_err(|e| { JavaError::NetworkError(format!("Failed to fetch available releases: {}", e)) })? - .json() + .json::<AvailableReleases>() .await .map_err(|e| { JavaError::SerializationError(format!("Failed to parse available releases: {}", e)) @@ -202,10 +203,9 @@ impl JavaProvider for AdoptiumProvider { available_major_versions: available.available_releases, lts_versions: available.available_lts_releases, cached_at: now, - cache_version: 1, }; - let _ = super::super::save_catalog_cache(app_handle, &catalog); + let _ = save_catalog_cache(app_handle, &catalog); Ok(catalog) } @@ -238,9 +238,10 @@ impl JavaProvider for AdoptiumProvider { ))); } - let assets: Vec<AdoptiumAsset> = response.json().await.map_err(|e| { - JavaError::SerializationError(format!("Failed to parse API response: {}", e)) - })?; + let assets: Vec<AdoptiumAsset> = + response.json::<Vec<AdoptiumAsset>>().await.map_err(|e| { + JavaError::SerializationError(format!("Failed to parse API response: {}", e)) + })?; let asset = assets .into_iter() @@ -265,9 +266,10 @@ impl JavaProvider for AdoptiumProvider { .await .map_err(|e| JavaError::NetworkError(format!("Network request failed: {}", e)))?; - let releases: AvailableReleases = response.json().await.map_err(|e| { - JavaError::SerializationError(format!("Failed to parse response: {}", e)) - })?; + let releases: AvailableReleases = + response.json::<AvailableReleases>().await.map_err(|e| { + JavaError::SerializationError(format!("Failed to parse response: {}", e)) + })?; Ok(releases.available_releases) } diff --git a/src-tauri/src/core/java/validation.rs b/src-tauri/src/core/java/validation.rs index e086e74..48782f6 100644 --- a/src-tauri/src/core/java/validation.rs +++ b/src-tauri/src/core/java/validation.rs @@ -8,12 +8,10 @@ use std::os::windows::process::CommandExt; use super::JavaInstallation; pub async fn check_java_installation(path: &PathBuf) -> Option<JavaInstallation> { - let path = path.clone(); - tokio::task::spawn_blocking(move || { - check_java_installation_blocking(&path) - }) - .await - .ok()? + let path = path.clone(); + tokio::task::spawn_blocking(move || check_java_installation_blocking(&path)) + .await + .ok()? } fn check_java_installation_blocking(path: &PathBuf) -> Option<JavaInstallation> { @@ -24,23 +22,23 @@ fn check_java_installation_blocking(path: &PathBuf) -> Option<JavaInstallation> #[cfg(target_os = "windows")] cmd.creation_flags(0x08000000); - let output = cmd.output().ok()?; + let output = cmd.output().ok()?; - let version_output = String::from_utf8_lossy(&output.stderr); + let version_output = String::from_utf8_lossy(&output.stderr); let version = parse_version_string(&version_output)?; let arch = extract_architecture(&version_output); let vendor = extract_vendor(&version_output); let is_64bit = version_output.to_lowercase().contains("64-bit") || arch == "aarch64"; - Some(JavaInstallation { - path: path.to_string_lossy().to_string(), - version, - arch, - vendor, - source: "system".to_string(), - is_64bit, - }) + Some(JavaInstallation { + path: path.to_string_lossy().to_string(), + version, + arch, + vendor, + source: "system".to_string(), + is_64bit, + }) } pub fn parse_version_string(output: &str) -> Option<String> { diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 7984ea8..b74c746 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -208,7 +208,6 @@ async fn start_game( let java_installation = core::java::priority::resolve_java_for_launch( app_handle, - &window, instance.java_path_override.as_deref(), Some(&config.java_path), required_java_major, |