59 lines
2.3 KiB
Rust
59 lines
2.3 KiB
Rust
// file: crates/ksp-app-config-desk/src/main.rs
|
|
// version: 3
|
|
|
|
//! 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 working_directory = configure_runtime_working_directory();
|
|
if let std::result::Result::Err(error) = working_directory {
|
|
eprintln!("cannot configure Config Desk runtime working directory: {error}");
|
|
return std::process::ExitCode::FAILURE;
|
|
}
|
|
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).truncate(false).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
|
|
},
|
|
};
|
|
}
|
|
|
|
fn configure_runtime_working_directory() -> std::io::Result<()> {
|
|
#[cfg(debug_assertions)]
|
|
{
|
|
let workspace_root = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("../..");
|
|
return std::env::set_current_dir(workspace_root);
|
|
}
|
|
#[cfg(not(debug_assertions))]
|
|
{
|
|
return std::result::Result::Ok(());
|
|
}
|
|
}
|