use std::path::PathBuf;
use clap::Parser;
use serde::{Deserialize, Serialize};
use v_utils_macros::{Settings, SettingsNested};
#[derive(Debug, Parser)]
struct Cli {
#[clap(flatten)]
settings_flags: SettingsFlags,
}
#[derive(Clone, Debug, Default, Settings, v_utils_macros::MyConfigPrimitives)]
struct TestConfig {
#[serde(default)]
host: String,
#[serde(default)]
port: u16,
#[serde(default)]
debug: bool,
#[settings(flatten)]
#[serde(default)]
database: Database,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, SettingsNested)]
struct Database {
#[serde(default)]
url: String,
#[serde(default)]
max_connections: u32,
}
#[test]
fn test_unknown_field_warning() {
let flags = SettingsFlags {
config: Some(v_utils::io::ExpandedPath(PathBuf::from(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/test_unknown_field.toml")))),
yes: false,
host: None,
port: None,
debug: None,
database: __SettingsNestedDatabase {
database_url: None,
database_max_connections: None,
},
};
eprintln!("\n=== Testing unknown field warning ===");
eprintln!("Config file: {:?}", flags.config);
eprintln!("Expected warnings for: unknown_top_level, some_other_field, unknown_section");
eprintln!("Should NOT warn about: host, port, debug, database (valid fields)");
match TestConfig::try_build(flags) {
Ok(config) => {
eprintln!("Config loaded: {config:?}");
eprintln!("(Unknown field warnings should have been printed above)");
}
Err(e) => {
eprintln!("Error loading config: {e}");
}
}
eprintln!("=== End of unknown field warning test ===\n");
}