From e98145ba554d9e8396dea96e466c14db10e988fc Mon Sep 17 00:00:00 2001 From: RaindropsSys Date: Fri, 10 May 2024 22:41:19 +0200 Subject: Crappy code fix 12/? --- launcher/src/constants.rs | 24 ++++++ launcher/src/lib.rs | 16 ++++ launcher/src/main.rs | 178 ++++++++++---------------------------------- launcher/src/search_path.rs | 86 +++++++++++++++++++++ 4 files changed, 164 insertions(+), 140 deletions(-) create mode 100644 launcher/src/constants.rs create mode 100644 launcher/src/lib.rs create mode 100644 launcher/src/search_path.rs diff --git a/launcher/src/constants.rs b/launcher/src/constants.rs new file mode 100644 index 0000000..eaf66fb --- /dev/null +++ b/launcher/src/constants.rs @@ -0,0 +1,24 @@ +// TODO: Rename these to "Atomic" + +#[cfg(target_os = "macos")] +pub const BINARY_PATH: &str = "Contents/MacOS/Electron"; + +#[cfg(target_os = "linux")] +pub const BINARY_PATH: &str = "electron"; + +#[cfg(target_os = "windows")] +pub const BINARY_PATH: &str = "electron.exe"; + +#[cfg(target_os = "macos")] +pub const APP_FOLDER_PATH: &str = "../Resources/app"; + +#[cfg(any(target_os = "linux", target_os = "windows"))] +pub const APP_FOLDER_PATH: &str = "./resources/app"; + +#[cfg(target_os = "macos")] +pub const APP_ASAR_PATH: &str = "../Resources/app.asar"; + +#[cfg(any(target_os = "linux", target_os = "windows"))] +pub const APP_ASAR_PATH: &str = "./resources/app.asar"; + +pub const VERSION: &str = env!("CARGO_PKG_VERSION"); diff --git a/launcher/src/lib.rs b/launcher/src/lib.rs new file mode 100644 index 0000000..9e2ef8b --- /dev/null +++ b/launcher/src/lib.rs @@ -0,0 +1,16 @@ +use std::ffi::OsStr; +use std::path::PathBuf; + +pub enum AppData { + Folder(PathBuf), + Asar(PathBuf) +} + +impl AppData { + pub fn get_path(&self) -> &OsStr { + match self { + AppData::Folder(path) => path.as_ref(), + AppData::Asar(path) => path.as_ref() + } + } +} diff --git a/launcher/src/main.rs b/launcher/src/main.rs index 4a87c81..bf11997 100644 --- a/launcher/src/main.rs +++ b/launcher/src/main.rs @@ -1,142 +1,26 @@ -use std::ffi::OsStr; +mod search_path; +mod constants; + use std::path::PathBuf; use std::process; - -enum AppData { - Folder(PathBuf), - Asar(PathBuf) -} - -impl AppData { - fn get_path(&self) -> &OsStr { - match self { - AppData::Folder(path) => path.as_ref(), - AppData::Asar(path) => path.as_ref() - } - } -} - -fn get_home() -> PathBuf { - dirs::home_dir().unwrap_or(PathBuf::from("/")) -} - -#[cfg(target_os = "macos")] -fn get_home_search() -> PathBuf { - let mut path = get_home(); - path.push("/Library/Frameworks/AtomicRuntime.framework"); - path -} - -#[cfg(target_os = "linux")] -fn get_home_search() -> PathBuf { - let mut path = get_home(); - path.push("/.local/share/atomic-runtime"); - path -} - -#[cfg(target_os = "windows")] -fn get_home_search() -> PathBuf { - let mut path = get_home(); - path.push("\\AppData\\Local\\Atomic Runtime"); - path -} - -#[cfg(target_os = "macos")] -fn get_search_paths() -> [PathBuf; 5] { - [ - PathBuf::from("/Library/Frameworks/AtomicRuntime.framework"), - PathBuf::from("/System/Library/Frameworks/AtomicRuntime.framework"), - PathBuf::from("/usr/local/lib/atomic-runtime"), - PathBuf::from("/opt/atomic-runtime"), - get_home_search(), - ] -} - -#[cfg(target_os = "linux")] -fn get_search_paths() -> [PathBuf; 8] { - [ - PathBuf::from("/usr/local/lib/atomic-runtime"), - PathBuf::from("/usr/local/lib64/atomic-runtime"), - PathBuf::from("/usr/lib/atomic-runtime"), - PathBuf::from("/usr/lib64/atomic-runtime"), - PathBuf::from("/lib/atomic-runtime"), - PathBuf::from("/lib64/atomic-runtime"), - PathBuf::from("/opt/atomic-runtime"), - get_home_search(), - ] -} - -#[cfg(target_os = "windows")] -fn get_search_paths() -> [PathBuf; 29] { - [ - PathBuf::from("C:\\Program Files\\Common Files\\Equestria.dev\\AtomicRuntime"), - PathBuf::from("C:\\Program Files\\Common Files\\Equestria.dev\\Atomic Runtime"), - PathBuf::from("C:\\Program Files (x86)\\Common Files\\Equestria.dev\\AtomicRuntime"), - PathBuf::from("C:\\Program Files (x86)\\Common Files\\Equestria.dev\\Atomic Runtime"), - PathBuf::from("C:\\Program Files (Arm)\\Common Files\\Equestria.dev\\AtomicRuntime"), - PathBuf::from("C:\\Program Files (Arm)\\Common Files\\Equestria.dev\\Atomic Runtime"), - PathBuf::from("C:\\Program Files\\Common Files\\AtomicRuntime"), - PathBuf::from("C:\\Program Files\\Common Files\\Atomic Runtime"), - PathBuf::from("C:\\Program Files (x86)\\Common Files\\AtomicRuntime"), - PathBuf::from("C:\\Program Files (x86)\\Common Files\\Atomic Runtime"), - PathBuf::from("C:\\Program Files (Arm)\\Common Files\\AtomicRuntime"), - PathBuf::from("C:\\Program Files (Arm)\\Common Files\\Atomic Runtime"), - PathBuf::from("C:\\Windows\\AtomicRuntime"), - PathBuf::from("C:\\Windows\\Atomic Runtime"), - PathBuf::from("C:\\Program Files\\Equestria.dev\\AtomicRuntime"), - PathBuf::from("C:\\Program Files\\Equestria.dev\\Atomic Runtime"), - PathBuf::from("C:\\Program Files (x86)\\Equestria.dev\\AtomicRuntime"), - PathBuf::from("C:\\Program Files (x86)\\Equestria.dev\\Atomic Runtime"), - PathBuf::from("C:\\Program Files (Arm)\\Equestria.dev\\AtomicRuntime"), - PathBuf::from("C:\\Program Files (Arm)\\Equestria.dev\\Atomic Runtime"), - PathBuf::from("C:\\Program Files\\AtomicRuntime"), - PathBuf::from("C:\\Program Files\\Atomic Runtime"), - PathBuf::from("C:\\Program Files (x86)\\AtomicRuntime"), - PathBuf::from("C:\\Program Files (x86)\\Atomic Runtime"), - PathBuf::from("C:\\Program Files (Arm)\\AtomicRuntime"), - PathBuf::from("C:\\Program Files (Arm)\\Atomic Runtime"), - PathBuf::from("C:\\ProgramData\\AtomicRuntime"), - PathBuf::from("C:\\ProgramData\\Atomic Runtime"), - get_home_search(), - ] -} +use launcher::AppData; fn show_system_info() { println!( "atomic-launcher: Starting atomic-launcher {} on {} ({})", - VERSION, + constants::VERSION, std::env::consts::OS, std::env::consts::ARCH ); -} - -// TODO: Rename these to "Atomic" - -#[cfg(target_os = "macos")] -const BINARY_PATH: &str = "Contents/MacOS/Electron"; - -#[cfg(target_os = "linux")] -const BINARY_PATH: &str = "electron"; -#[cfg(target_os = "windows")] -const BINARY_PATH: &str = "electron.exe"; - -#[cfg(target_os = "macos")] -const APP_FOLDER_PATH: &str = "../Resources/app"; - -#[cfg(any(target_os = "linux", target_os = "windows"))] -const APP_FOLDER_PATH: &str = "./resources/app"; - -#[cfg(target_os = "macos")] -const APP_ASAR_PATH: &str = "../Resources/app.asar"; - -#[cfg(any(target_os = "linux", target_os = "windows"))] -const APP_ASAR_PATH: &str = "./resources/app.asar"; - -const VERSION: &str = env!("CARGO_PKG_VERSION"); + println!( + "atomic-launcher: Compiled against rustc {}", + rustc_version_runtime::version() + ); +} fn is_valid_path(mut path: PathBuf) -> Option { - path.push(BINARY_PATH); + path.push(constants::BINARY_PATH); let as_path = path.as_path(); if as_path.is_file() { @@ -148,26 +32,34 @@ fn is_valid_path(mut path: PathBuf) -> Option { fn main() { show_system_info(); - println!( - "atomic-launcher: Compiled against rustc {}", - rustc_version_runtime::version() - ); - - let exec_path = std::env::current_exe().ok(); - let work_dir = exec_path.as_ref().and_then(|p| p.parent()).unwrap(); + let work_dir = get_working_directory(); println!( "atomic-launcher: Current directory: {}", work_dir.to_str().unwrap() ); + let app_data = locate_app(&work_dir); + let runtime_path = locate_runtime(); + launch_app(runtime_path, app_data) +} + +fn get_working_directory() -> PathBuf { + let exec_path = std::env::current_exe().ok(); + exec_path.as_ref() + .and_then(|p| p.parent()) + .unwrap() + .to_owned() +} + +fn locate_app(work_dir: &PathBuf) -> Option { let mut app_data: Option = None; let mut app_path_folder = PathBuf::from(work_dir); - app_path_folder.push(APP_FOLDER_PATH); + app_path_folder.push(constants::APP_FOLDER_PATH); let mut app_path_asar = PathBuf::from(work_dir); - app_path_asar.push(APP_ASAR_PATH); + app_path_asar.push(constants::APP_ASAR_PATH); if app_path_folder.exists() { app_data = Some(AppData::Folder(app_path_folder)) @@ -182,7 +74,11 @@ fn main() { ); } - let runtime_search_paths = get_search_paths(); + app_data +} + +fn locate_runtime() -> Option { + let runtime_search_paths = search_path::get_search_paths(); let runtime_search_paths_string = runtime_search_paths .iter() .map(|i| i.to_str().unwrap()) @@ -194,17 +90,19 @@ fn main() { runtime_search_paths_string ); - let runtime_path = runtime_search_paths.into_iter() + runtime_search_paths.into_iter() .filter_map(is_valid_path) - .next(); + .next() +} +fn launch_app(runtime_path: Option, app_data: Option) { if let Some(path) = runtime_path { println!( "atomic-launcher: Found atomic-runtime at {}", path.to_str().unwrap() ); let mut cmd = process::Command::new(path); - cmd.env("ATOMIC_LAUNCHER_VERSION", VERSION); + cmd.env("ATOMIC_LAUNCHER_VERSION", constants::VERSION); println!("atomic-launcher: Executing: {:?}", cmd); if let Some(app_data) = app_data { diff --git a/launcher/src/search_path.rs b/launcher/src/search_path.rs new file mode 100644 index 0000000..6c3b920 --- /dev/null +++ b/launcher/src/search_path.rs @@ -0,0 +1,86 @@ +use std::path::PathBuf; + +fn get_home() -> PathBuf { + dirs::home_dir().unwrap_or(PathBuf::from("/")) +} + +#[cfg(target_os = "macos")] +fn get_home_search() -> PathBuf { + let mut path = get_home(); + path.push("/Library/Frameworks/AtomicRuntime.framework"); + path +} + +#[cfg(target_os = "linux")] +fn get_home_search() -> PathBuf { + let mut path = get_home(); + path.push("/.local/share/atomic-runtime"); + path +} + +#[cfg(target_os = "windows")] +fn get_home_search() -> PathBuf { + let mut path = get_home(); + path.push("\\AppData\\Local\\Atomic Runtime"); + path +} + +#[cfg(target_os = "macos")] +pub fn get_search_paths() -> [PathBuf; 5] { + [ + PathBuf::from("/Library/Frameworks/AtomicRuntime.framework"), + PathBuf::from("/System/Library/Frameworks/AtomicRuntime.framework"), + PathBuf::from("/usr/local/lib/atomic-runtime"), + PathBuf::from("/opt/atomic-runtime"), + get_home_search(), + ] +} + +#[cfg(target_os = "linux")] +pub fn get_search_paths() -> [PathBuf; 8] { + [ + PathBuf::from("/usr/local/lib/atomic-runtime"), + PathBuf::from("/usr/local/lib64/atomic-runtime"), + PathBuf::from("/usr/lib/atomic-runtime"), + PathBuf::from("/usr/lib64/atomic-runtime"), + PathBuf::from("/lib/atomic-runtime"), + PathBuf::from("/lib64/atomic-runtime"), + PathBuf::from("/opt/atomic-runtime"), + get_home_search(), + ] +} + +#[cfg(target_os = "windows")] +pub fn get_search_paths() -> [PathBuf; 29] { + [ + PathBuf::from("C:\\Program Files\\Common Files\\Equestria.dev\\AtomicRuntime"), + PathBuf::from("C:\\Program Files\\Common Files\\Equestria.dev\\Atomic Runtime"), + PathBuf::from("C:\\Program Files (x86)\\Common Files\\Equestria.dev\\AtomicRuntime"), + PathBuf::from("C:\\Program Files (x86)\\Common Files\\Equestria.dev\\Atomic Runtime"), + PathBuf::from("C:\\Program Files (Arm)\\Common Files\\Equestria.dev\\AtomicRuntime"), + PathBuf::from("C:\\Program Files (Arm)\\Common Files\\Equestria.dev\\Atomic Runtime"), + PathBuf::from("C:\\Program Files\\Common Files\\AtomicRuntime"), + PathBuf::from("C:\\Program Files\\Common Files\\Atomic Runtime"), + PathBuf::from("C:\\Program Files (x86)\\Common Files\\AtomicRuntime"), + PathBuf::from("C:\\Program Files (x86)\\Common Files\\Atomic Runtime"), + PathBuf::from("C:\\Program Files (Arm)\\Common Files\\AtomicRuntime"), + PathBuf::from("C:\\Program Files (Arm)\\Common Files\\Atomic Runtime"), + PathBuf::from("C:\\Windows\\AtomicRuntime"), + PathBuf::from("C:\\Windows\\Atomic Runtime"), + PathBuf::from("C:\\Program Files\\Equestria.dev\\AtomicRuntime"), + PathBuf::from("C:\\Program Files\\Equestria.dev\\Atomic Runtime"), + PathBuf::from("C:\\Program Files (x86)\\Equestria.dev\\AtomicRuntime"), + PathBuf::from("C:\\Program Files (x86)\\Equestria.dev\\Atomic Runtime"), + PathBuf::from("C:\\Program Files (Arm)\\Equestria.dev\\AtomicRuntime"), + PathBuf::from("C:\\Program Files (Arm)\\Equestria.dev\\Atomic Runtime"), + PathBuf::from("C:\\Program Files\\AtomicRuntime"), + PathBuf::from("C:\\Program Files\\Atomic Runtime"), + PathBuf::from("C:\\Program Files (x86)\\AtomicRuntime"), + PathBuf::from("C:\\Program Files (x86)\\Atomic Runtime"), + PathBuf::from("C:\\Program Files (Arm)\\AtomicRuntime"), + PathBuf::from("C:\\Program Files (Arm)\\Atomic Runtime"), + PathBuf::from("C:\\ProgramData\\AtomicRuntime"), + PathBuf::from("C:\\ProgramData\\Atomic Runtime"), + get_home_search(), + ] +} -- cgit