diff options
Diffstat (limited to 'src-tauri/src/core/java/mod.rs')
| -rw-r--r-- | src-tauri/src/core/java/mod.rs | 161 |
1 files changed, 88 insertions, 73 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> { |