app

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

commit a1a7c26d9f034e6d27c5b1c3711f2ba57072ee57
parent d9a75abc8d1a4a853e7daf893e20f49966e1991a
Author: triesap <tyson@radroots.org>
Date:   Sun, 24 May 2026 05:23:01 +0000

core: add app path env reader

- resolve desktop runtime host inputs from a supplied env reader
- keep current-process resolution on the same env contract
- cover repo-local app paths without process env mutation
- validate focused app-core path test, cargo check, and fmt

Diffstat:
Mcrates/shared/core/src/paths.rs | 47+++++++++++++++++++++++++++++++++++++++--------
1 file changed, 39 insertions(+), 8 deletions(-)

diff --git a/crates/shared/core/src/paths.rs b/crates/shared/core/src/paths.rs @@ -1,6 +1,7 @@ use std::{ env, error::Error, + ffi::OsString, fmt, path::{Path, PathBuf}, }; @@ -61,12 +62,20 @@ pub struct AppRuntimeHostEnvironment { impl AppRuntimeHostEnvironment { pub fn from_current_process() -> Self { + Self::from_env_reader(|name| env::var_os(name)) + } + + pub fn from_env_reader<F>(mut read_env: F) -> Self + where + F: FnMut(&str) -> Option<OsString>, + { Self { - home_dir: env::var_os("HOME").map(PathBuf::from), - appdata_dir: env::var_os("APPDATA").map(PathBuf::from), - localappdata_dir: env::var_os("LOCALAPPDATA").map(PathBuf::from), - paths_profile: env::var(APP_PATHS_PROFILE_ENV).ok(), - repo_local_root: env::var_os(APP_PATHS_REPO_LOCAL_ROOT_ENV).map(PathBuf::from), + home_dir: read_env("HOME").map(PathBuf::from), + appdata_dir: read_env("APPDATA").map(PathBuf::from), + localappdata_dir: read_env("LOCALAPPDATA").map(PathBuf::from), + paths_profile: read_env(APP_PATHS_PROFILE_ENV) + .and_then(|value| value.into_string().ok()), + repo_local_root: read_env(APP_PATHS_REPO_LOCAL_ROOT_ENV).map(PathBuf::from), } } } @@ -298,11 +307,12 @@ impl Error for AppRuntimePathsError {} #[cfg(test)] mod tests { - use std::path::PathBuf; + use std::{collections::BTreeMap, ffi::OsString, path::PathBuf}; use super::{ - APP_RUNTIME_NAMESPACE, AppDesktopRuntimePaths, AppRuntimeHostEnvironment, - AppRuntimePathsError, AppRuntimePlatform, AppRuntimeRoots, SHARED_ACCOUNTS_NAMESPACE, + APP_PATHS_PROFILE_ENV, APP_PATHS_REPO_LOCAL_ROOT_ENV, APP_RUNTIME_NAMESPACE, + AppDesktopRuntimePaths, AppRuntimeHostEnvironment, AppRuntimePathsError, + AppRuntimePlatform, AppRuntimeRoots, SHARED_ACCOUNTS_NAMESPACE, SHARED_ACCOUNTS_STORE_FILE_NAME, SHARED_IDENTITIES_NAMESPACE, SHARED_IDENTITY_FILE_NAME, }; @@ -428,6 +438,27 @@ mod tests { } #[test] + fn host_environment_can_resolve_from_env_reader() { + let env = BTreeMap::from([ + (APP_PATHS_PROFILE_ENV, OsString::from("repo_local")), + ( + APP_PATHS_REPO_LOCAL_ROOT_ENV, + OsString::from("/repo/infra/local/runtime/radroots"), + ), + ]); + let paths = AppDesktopRuntimePaths::for_desktop( + AppRuntimePlatform::Linux, + AppRuntimeHostEnvironment::from_env_reader(|name| env.get(name).cloned()), + ) + .expect("repo-local env-backed roots should resolve"); + + assert_eq!( + paths.app.data, + PathBuf::from("/repo/infra/local/runtime/radroots/data/apps/app") + ); + } + + #[test] fn repo_local_profile_requires_explicit_root() { let err = AppRuntimeRoots::for_desktop( AppRuntimePlatform::Macos,