diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 7d3bdfc..089e9bb 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -30,14 +30,27 @@ pub async fn kill_process( state.kill(&id).await } +pub fn get_binary_candidates(binary_name: &str) -> Vec { + if cfg!(windows) && !binary_name.to_lowercase().ends_with(".exe") { + vec![format!("{}.exe", binary_name), binary_name.to_string()] + } else { + vec![binary_name.to_string()] + } +} + #[tauri::command] pub async fn resolve_binary(app: AppHandle, binary_name: String) -> Result { let settings = crate::settings::load_settings(app.clone()).unwrap_or_default(); + let candidates = get_binary_candidates(&binary_name); + if let Some(dir) = settings.argyll_binary_dir { if !dir.trim().is_empty() { - let custom_path = std::path::Path::new(&dir).join(&binary_name); - if custom_path.exists() { - return Ok(custom_path.to_string_lossy().to_string()); + let base_dir = std::path::Path::new(&dir); + for name in &candidates { + let custom_path = base_dir.join(name); + if custom_path.exists() { + return Ok(custom_path.to_string_lossy().to_string()); + } } } } @@ -50,10 +63,22 @@ pub async fn resolve_binary(app: AppHandle, binary_name: String) -> Result "linux-x86_64", }; + for name in &candidates { + if let Ok(resource_path) = app.path().resolve( + format!("argyll/{}/{}", platform, name), + tauri::path::BaseDirectory::Resource, + ) { + if resource_path.exists() { + return Ok(resource_path.to_string_lossy().to_string()); + } + } + } + + let primary_name = &candidates[0]; let resource_path = app .path() .resolve( - format!("argyll/{}/{}", platform, binary_name), + format!("argyll/{}/{}", platform, primary_name), tauri::path::BaseDirectory::Resource, ) .map_err(|e| e.to_string())?; @@ -707,4 +732,17 @@ mod tests { let args = build_profcheck_args(&config); assert_eq!(args, vec!["-v", "-k", "-s", "my_profile.ti3", "my_profile.icc"]); } -} + + #[test] + fn test_get_binary_candidates() { + let candidates = get_binary_candidates("targen"); + if cfg!(windows) { + assert_eq!(candidates, vec!["targen.exe", "targen"]); + } else { + assert_eq!(candidates, vec!["targen"]); + } + + let candidates_exe = get_binary_candidates("targen.exe"); + assert_eq!(candidates_exe, vec!["targen.exe"]); + } +} \ No newline at end of file