aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src-tauri
diff options
context:
space:
mode:
Diffstat (limited to 'src-tauri')
-rw-r--r--src-tauri/src/core/java/mod.rs161
-rw-r--r--src-tauri/src/core/java/priority.rs76
-rw-r--r--src-tauri/src/core/java/providers/adoptium.rs22
-rw-r--r--src-tauri/src/core/java/validation.rs30
-rw-r--r--src-tauri/src/main.rs1
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,