//! Data and resource locations. //! //! 0.1.1 deliberately keeps the Electron 0.1.0 user-data directory //! (`app.setName("CH-J Server Manager")` → `app.getPath("userData")`): //! * macOS: ~/Library/Application Support/CH-J Server Manager //! * Windows: %APPDATA%\CH-J Server Manager //! * Linux: $XDG_CONFIG_HOME/CH-J Server Manager (default ~/.config/…) //! //! so the existing vault, profiles, settings, modules and history are used in place. use std::path::{Path, PathBuf}; pub const APP_DIRECTORY_NAME: &str = "CH-J Server Manager"; /// Test/smoke override (absolute path only), same variable name as in 0.1.0 plus a neutral alias. pub const USER_DATA_OVERRIDE_VARS: [&str; 2] = ["CHJ_USER_DATA_DIR", "CHJ_BUILD_SMOKE_USER_DATA_DIR"]; #[derive(Clone, Debug)] pub struct AppPaths { /// User data root (identical to Electron 0.1.0 `userData`). pub data: PathBuf, /// Bundled resources (licenses, docs, remote scripts, native helpers, modules). pub resources: PathBuf, } impl AppPaths { pub fn resolve(config_dir: Option, resources: PathBuf) -> Result { for var in USER_DATA_OVERRIDE_VARS { if let Ok(value) = std::env::var(var) { let path = PathBuf::from(value); if path.is_absolute() { return Ok(Self { data: path, resources }); } } } let base = config_dir.ok_or("The user configuration directory is unavailable.")?; Ok(Self { data: base.join(APP_DIRECTORY_NAME), resources }) } pub fn remote_script(&self, name: &str) -> PathBuf { self.resources.join("remote").join(name) } pub fn docs(&self) -> PathBuf { self.resources.join("docs") } pub fn licenses(&self) -> PathBuf { self.resources.join("licenses") } pub fn bundled_modules(&self) -> PathBuf { self.resources.join("modules") } pub fn module_webview_data(&self, module_id: &str) -> PathBuf { self.data.join("webview").join("modules").join(module_id) } pub fn in_data(&self, relative: impl AsRef) -> PathBuf { self.data.join(relative) } }