#![allow(unused)]
use clap::Parser;
use serde::{Deserialize, Serialize};
use v_utils_macros::{Settings, SettingsNested};
#[derive(Clone, Debug, v_utils_macros::MyConfigPrimitives, Serialize, Settings)]
struct Config {
#[serde(default)]
host: String,
#[serde(default)]
port: u16,
#[serde(default)]
debug: bool,
#[settings(flatten)]
#[serde(default)]
database: Database,
}
impl Default for Config {
fn default() -> Self {
Self {
host: "localhost".to_string(),
port: 8080,
debug: false,
database: Database::default(),
}
}
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, SettingsNested)]
struct Database {
#[serde(default)]
url: String,
#[serde(default)]
max_connections: u32,
}
fn main() {
let _write_defaults_exists: fn() -> Result<std::path::PathBuf, v_utils::__internal::eyre::Report> = Config::write_defaults;
{
let config = Config::default();
assert!(config.diff_from_defaults().is_none());
}
{
let config = Config {
host: "custom-host".to_string(),
..Default::default()
};
let diff = config.diff_from_defaults().unwrap();
insta::assert_snapshot!(diff, @r###"host: "localhost" -> "custom-host""###);
}
{
let config = Config {
host: "production".to_string(),
port: 8080, debug: true,
database: Database::default(),
};
let diff = config.diff_from_defaults().unwrap();
insta::assert_snapshot!(diff, @r###"
debug: false -> true
host: "localhost" -> "production"
"###);
}
{
let config = Config {
host: "app-server".to_string(),
port: 9000,
debug: false, database: Database {
url: "postgres://localhost/db".to_string(),
max_connections: 10,
},
};
let diff = config.diff_from_defaults().unwrap();
insta::assert_snapshot!(diff, @r###"
database.max_connections: 0 -> 10
database.url: "" -> "postgres://localhost/db"
host: "localhost" -> "app-server"
port: 8080 -> 9000
"###);
}
{
let config = Config {
database: Database {
url: "postgres://localhost/db".to_string(),
max_connections: 0, },
..Default::default()
};
let diff = config.diff_from_defaults().unwrap();
insta::assert_snapshot!(diff, @r###"database.url: "" -> "postgres://localhost/db""###);
}
}