app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit a0fcf814687eb9ba27fc81f9abd88b7a789850d1
parent 8cf6b880735cb9ba24abac3a9b088fed018957ae
Author: triesap <tyson@radroots.org>
Date:   Sun, 19 Apr 2026 21:07:49 +0000

runtime: fix lazy local log root loading

Diffstat:
Mcrates/shared/core/src/runtime.rs | 45+++++++++++++++++++++++++++++++++------------
1 file changed, 33 insertions(+), 12 deletions(-)

diff --git a/crates/shared/core/src/runtime.rs b/crates/shared/core/src/runtime.rs @@ -94,13 +94,12 @@ pub enum AppRuntimeConfigError { impl AppRuntimeConfig { pub fn from_env() -> Result<Self, AppRuntimeConfigError> { - let default_log_root = AppRuntimeRoots::current_desktop()?.logs; - Self::from_env_with(|name| std::env::var(name).ok(), default_log_root) + Self::from_env_with(|name| std::env::var(name).ok(), None) } fn from_env_with<F>( mut read_env: F, - default_log_root: PathBuf, + default_log_root: Option<PathBuf>, ) -> Result<Self, AppRuntimeConfigError> where F: FnMut(&str) -> Option<String>, @@ -113,8 +112,14 @@ impl AppRuntimeConfig { require_env_value(&mut read_env, APP_DEFAULT_NOSTR_RELAY_URL_ENV)?; let local_log_root = read_env(APP_LOCAL_LOG_ROOT_ENV) .map(|value| require_path_value(APP_LOCAL_LOG_ROOT_ENV, value)) - .transpose()? - .unwrap_or(default_log_root); + .transpose()?; + let local_log_root = match local_log_root { + Some(local_log_root) => local_log_root, + None => match default_log_root { + Some(default_log_root) => default_log_root, + None => AppRuntimeRoots::current_desktop()?.logs, + }, + }; Ok(Self { runtime_mode, @@ -344,7 +349,7 @@ mod tests { ]); let error = AppRuntimeConfig::from_env_with( |name| env.get(name).cloned(), - PathBuf::from("/tmp/default-logs"), + Some(PathBuf::from("/tmp/default-logs")), ) .expect_err("missing runtime mode env should fail"); @@ -366,9 +371,9 @@ mod tests { ]); let config = AppRuntimeConfig::from_env_with( |name| env.get(name).cloned(), - PathBuf::from("/tmp/default-logs"), + Some(PathBuf::from("/tmp/default-logs")), ) - .expect("valid env config"); + .expect("valid env config"); assert_eq!(config.runtime_mode, AppRuntimeMode::LocalhostDev); assert_eq!(config.default_nostr_relay_url, "ws://127.0.0.1:8080"); @@ -380,7 +385,7 @@ mod tests { let env = test_runtime_env(); let config = AppRuntimeConfig::from_env_with( |name| env.get(name).cloned(), - PathBuf::from("/tmp/default-logs"), + Some(PathBuf::from("/tmp/default-logs")), ) .expect("default log root should apply"); @@ -388,6 +393,22 @@ mod tests { } #[test] + fn runtime_config_accepts_explicit_log_root_without_default_runtime_paths() { + let env = BTreeMap::from([ + (APP_RUNTIME_MODE_ENV, "localhost-dev".to_owned()), + ( + APP_DEFAULT_NOSTR_RELAY_URL_ENV, + "ws://127.0.0.1:8080".to_owned(), + ), + (APP_LOCAL_LOG_ROOT_ENV, "/tmp/explicit-logs".to_owned()), + ]); + let config = AppRuntimeConfig::from_env_with(|name| env.get(name).cloned(), None) + .expect("explicit local log root should bypass runtime root discovery"); + + assert_eq!(config.local_log_root, PathBuf::from("/tmp/explicit-logs")); + } + + #[test] fn runtime_snapshot_falls_back_to_build_profile_when_git_commit_is_missing() { let mut build = test_build_identity(); build.git_commit = None; @@ -437,7 +458,7 @@ mod tests { ]); let error = AppRuntimeConfig::from_env_with( |name| env.get(name).cloned(), - PathBuf::from("/tmp/default-logs"), + Some(PathBuf::from("/tmp/default-logs")), ) .expect_err("missing relay env should fail"); @@ -457,9 +478,9 @@ mod tests { ]); let error = AppRuntimeConfig::from_env_with( |name| env.get(name).cloned(), - PathBuf::from("/tmp/default-logs"), + Some(PathBuf::from("/tmp/default-logs")), ) - .expect_err("missing default relay url should fail"); + .expect_err("missing default relay url should fail"); assert!( matches!(