v0.1.4-pre.004

This commit is contained in:
2026-08-16 10:40:23 +02:00
parent fa6d4e1039
commit fcc1e9913d
20 changed files with 633 additions and 17 deletions

View File

@@ -0,0 +1,7 @@
// file: crates/ksp-app-config-desk/src/errors.rs
// version: 1
//! Application-local error codes for the configuration desktop shell.
/// Tauri runtime assembly or execution failed.
pub(crate) const ERROR_CODE_TAURI_RUNTIME_FAILED: ksp_core_lib::ErrorCode = ksp_core_lib::ErrorCode::new("config_desk", "tauri_runtime_failed");

View File

@@ -0,0 +1,16 @@
// file: crates/ksp-app-config-desk/src/lib.rs
// version: 1
//! Tauri desktop application for managing and validating KSP configuration.
#![forbid(unsafe_code)]
#![deny(unreachable_pub)]
#![warn(missing_docs)]
mod errors;
mod tauri;
/// Runs the KSP configuration desktop application.
pub use self::tauri::run;
pub(crate) use self::errors::ERROR_CODE_TAURI_RUNTIME_FAILED;

View File

@@ -0,0 +1,41 @@
// file: crates/ksp-app-config-desk/src/main.rs
// version: 1
//! Binary entry point for the KSP configuration desktop application.
#![forbid(unsafe_code)]
#![deny(unreachable_pub)]
#![warn(missing_docs)]
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use fs2::FileExt; // rust-rules: trait-import
fn main() -> std::process::ExitCode {
let mut lock_path = std::env::temp_dir();
lock_path.push("com_sasedev_ksp_app_config_desk.lock");
let lock_file = match std::fs::OpenOptions::new().read(true).write(true).create(true).open(&lock_path) {
std::result::Result::Ok(file) => file,
std::result::Result::Err(error) => {
eprintln!("cannot create application lock '{}': {error}", lock_path.display());
return std::process::ExitCode::FAILURE;
},
};
if let std::result::Result::Err(error) = lock_file.try_lock_exclusive() {
if error.kind() == std::io::ErrorKind::WouldBlock {
eprintln!("another ksp-app-config-desk instance is already running");
return std::process::ExitCode::FAILURE;
}
eprintln!("cannot acquire application lock '{}': {error}", lock_path.display());
return std::process::ExitCode::FAILURE;
}
let _lock_file = lock_file;
let arguments = std::env::args_os().collect::<std::vec::Vec<std::ffi::OsString>>();
let run_result = ksp_app_config_desk_lib::run(arguments.as_slice());
return match run_result {
std::result::Result::Ok(()) => std::process::ExitCode::SUCCESS,
std::result::Result::Err(error) => {
eprintln!("application error: {error}");
std::process::ExitCode::FAILURE
},
};
}

View File

@@ -0,0 +1,33 @@
// file: crates/ksp-app-config-desk/src/tauri.rs
// version: 1
//! Tauri runtime assembly for the KSP configuration desktop application.
use tauri::Manager; // rust-rules: trait-import
/// Runs the configuration desktop application.
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run(_arguments: &[std::ffi::OsString]) -> ksp_core_lib::Result<()> {
let mut builder = tauri::Builder::default();
builder = configure_setup(builder);
let run_result = builder.run(tauri::generate_context!());
return match run_result {
std::result::Result::Ok(()) => std::result::Result::Ok(()),
std::result::Result::Err(error) => std::result::Result::Err(
ksp_core_lib::Error::new(crate::ERROR_CODE_TAURI_RUNTIME_FAILED, "Cannot run KSP Config Desk Tauri runtime")
.with_context("tauri_error", error.to_string()),
),
};
}
fn configure_setup(builder: tauri::Builder<tauri::Wry>) -> tauri::Builder<tauri::Wry> {
return builder.setup(|app| {
if app.get_webview_window("splash").is_none() {
return std::result::Result::Err(std::boxed::Box::new(std::io::Error::new(std::io::ErrorKind::NotFound, "splash window is missing")));
}
if app.get_webview_window("main").is_none() {
return std::result::Result::Err(std::boxed::Box::new(std::io::Error::new(std::io::ErrorKind::NotFound, "main window is missing")));
}
return std::result::Result::Ok(());
});
}