// file: crates/ksp-app-wallet-desk/src/main.rs // version: 1 //! Binary entry point for the KSP wallet 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 Wallet 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_wallet_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-wallet-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::>(); let run_result = ksp_app_wallet_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(()); } }