use figment::Figment;
use serde::Deserialize;
use figment_winreg::{FailStrategy, RegistryProvider};
use winreg::enums::HKEY_CURRENT_USER;
#[derive(Debug, PartialEq, Deserialize)]
struct AppConfig {
#[serde(rename = "SubKeyInRoot")]
subkey: Option<SubKeyInRoot>,
#[serde(rename = "AnotherSubKey")]
subkeytoo: Option<AnotherSubKey>,
#[serde(rename = "RootString")]
rootstring: String,
#[serde(rename = "RootDWord")]
rootu32: u32,
#[serde(rename = "RootQWord")]
rootu64: u64,
#[serde(rename = "StrVec")]
strvec: Vec<String>
}
#[derive(Debug, PartialEq, Deserialize)]
struct SubKeyInRoot {
#[serde(rename = "ReqStr")]
reqstr: String,
#[serde(rename = "OptStr")]
optstr: Option<String>,
#[serde(rename = "ExpStr")]
expstr: String,
#[serde(rename = "SubSubKey")]
subsubkey: Option<SubSubKey>
}
#[derive(Debug, PartialEq, Deserialize)]
struct AnotherSubKey {
#[serde(rename = "OptStr")]
optstr: Option<String>
}
#[derive(Debug, PartialEq, Deserialize)]
struct SubSubKey {
#[serde(rename = "Greeting")]
greeting: String,
#[serde(rename = "OptStrVec")]
optstrvec: Option<Vec<String>>
}
fn main() {
let fig = Figment::new().merge(
RegistryProvider::new(HKEY_CURRENT_USER, r"Temp\figment")
.fail_strategy(FailStrategy::Skip)
);
let value: String = fig.extract_inner("RootString").unwrap();
println!("rootstring: {value}");
let value: String = fig.extract_inner(r"SubKeyInRoot.ExpStr").unwrap();
println!("rootstring.expstr: {value}");
let config: AppConfig = fig.extract().unwrap();
println!("AppConfig: {config:?}");
}
// vim: set ft=rust et sw=2 ts=2 sts=2 cinoptions=2 tw=79 :