v0.5.2-pre.006-fix-010

This commit is contained in:
2026-08-11 12:03:35 +02:00
parent 1ee1d0297d
commit 56572cec40
67 changed files with 2484 additions and 539 deletions

View File

@@ -1,5 +1,5 @@
// file: ks-config/src/settings.rs
// version: 24
// version: 25
//! Resolved runtime configuration models retained during the `0.5.1` source-document split.
@@ -222,8 +222,10 @@ pub struct AccountListenerConfig {
/// Wallet configuration.
#[derive(Clone, serde::Deserialize, Eq, PartialEq)]
pub struct WalletConfig {
/// Wallet directory path.
/// Persistent native wallet directory path.
pub wallet_dir: std::string::String,
/// Profile-specific temporary wallet and fixture directory path.
pub temporary_wallet_dir: std::string::String,
/// Selected cluster name.
pub cluster: std::string::String,
/// Optional persistent native wallet alias selected by this profile.
@@ -734,6 +736,10 @@ pub(crate) fn validate_wallet(config: &WalletConfig) -> ks_core::Result<()> {
std::result::Result::Ok(()) => (),
std::result::Result::Err(error) => return std::result::Result::Err(error),
}
match require_non_empty(&config.temporary_wallet_dir, "wallet.temporary_wallet_dir") {
std::result::Result::Ok(()) => (),
std::result::Result::Err(error) => return std::result::Result::Err(error),
}
match require_non_empty(&config.cluster, "wallet.cluster") {
std::result::Result::Ok(()) => (),
std::result::Result::Err(error) => return std::result::Result::Err(error),

View File

@@ -1,5 +1,5 @@
// file: ks-config/src/wallet.rs
// version: 4
// version: 6
//! Independent wallet configuration document loading and validation.
@@ -21,7 +21,7 @@ pub struct WalletConfigDocument {
pub struct WalletProfileConfig {
/// Profile code.
pub name: std::string::String,
/// Wallet subdirectory or absolute directory.
/// Temporary wallet/fixture subdirectory or absolute directory.
pub directory: std::string::String,
/// Selected cluster name.
pub cluster: std::string::String,
@@ -143,14 +143,16 @@ pub fn resolved_wallet_profile(
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
let configured = std::path::PathBuf::from(profile.directory.as_str());
let wallet_dir = if configured.is_absolute() {
configured
let persistent_wallet_dir = std::path::PathBuf::from(document.wallets_directory.as_str());
let configured_temporary = std::path::PathBuf::from(profile.directory.as_str());
let temporary_wallet_dir = if configured_temporary.is_absolute() {
configured_temporary
} else {
std::path::PathBuf::from(document.wallets_directory.as_str()).join(configured)
persistent_wallet_dir.join(configured_temporary)
};
let resolved = crate::WalletConfig {
wallet_dir: wallet_dir.display().to_string(),
wallet_dir: persistent_wallet_dir.display().to_string(),
temporary_wallet_dir: temporary_wallet_dir.display().to_string(),
cluster: profile.cluster.clone(),
wallet_alias: profile.wallet_alias.clone(),
temporary_wallet_enabled: profile.temporary_wallet_enabled,
@@ -233,6 +235,25 @@ mod tests {
);
}
#[test]
fn resolved_profile_separates_persistent_and_temporary_wallet_directories() {
let resolved_raw = crate::resolve_environment_placeholders(DEFAULT_WALLET);
let document = match super::parse_wallet_json(resolved_raw.as_str()) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("resolved wallet config failed: {error}"),
};
let resolved = match super::resolved_wallet_profile(&document, "local_devnet") {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("wallet profile resolution failed: {error}"),
};
assert!(!resolved.wallet_dir.contains("${"));
let expected_temporary = std::path::PathBuf::from(resolved.wallet_dir.as_str())
.join("temporary/local_devnet")
.display()
.to_string();
assert_eq!(resolved.temporary_wallet_dir, expected_temporary);
}
#[test]
fn wallet_profile_without_persistent_alias_remains_backward_compatible() {
let mut value = match serde_json::from_str::<serde_json::Value>(DEFAULT_WALLET) {