diff --git a/src/server/config.rs b/src/server/config.rs index c6d8248..cc31583 100644 --- a/src/server/config.rs +++ b/src/server/config.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use serde::Deserialize; /// Enable secure cookies by default only in release mode @@ -141,12 +143,18 @@ impl KeyValStoreConfig { } } +#[derive(Debug, Clone, Deserialize)] +pub struct ServerConfig { + pub public_path: PathBuf, +} + #[derive(Debug, Clone, Deserialize)] /// Top-level application configuration pub struct Config { pub auth: AuthConfig, pub database: DatabaseConfig, pub key_val_store: KeyValStoreConfig, + pub server: ServerConfig, } /// Parse configuration from the expected files and environment variables @@ -159,6 +167,7 @@ pub fn load_config() -> Result { .set_default("server.port", 8080)? .set_default("auth.open_signup", false)? .set_default("auth.cookies_secure", DEFAULT_COOKIES_SECURE)? + .set_default("server.public_path", default_public_dir())? .add_source(File::with_name(&format!("/etc/{pkg_name}/config")).required(false)) .add_source(File::with_name(&format!("/etc/{pkg_name}")).required(false)) .add_source(File::with_name("config").required(false)) @@ -166,3 +175,19 @@ pub fn load_config() -> Result { .build()? .try_deserialize() } + +/// Provide a sane default for the public path, using the same sources as Dioxus does internally. +/// Checks the `DIOXUS_PUBLIC_PATH` environment variable, then tries relative to the path of this +/// executable +fn default_public_dir() -> Option { + std::env::var("DIOXUS_PUBLIC_PATH").ok().or_else(|| { + std::env::current_exe().ok().and_then(|path| { + path.parent() + .expect("current executable path must have a parent") + .join("public") + .into_os_string() + .into_string() + .ok() + }) + }) +}