v_utils_macros 2.11.26

Macros for my utils crate
Documentation
//! Test for the diff_from_defaults and write_defaults methods generated by Settings macro.
#![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() {
	// Verify write_defaults method exists and has correct signature
	let _write_defaults_exists: fn() -> Result<std::path::PathBuf, v_utils::__internal::eyre::Report> = Config::write_defaults;

	// Test 1: All defaults - should return None
	{
		let config = Config::default();
		assert!(config.diff_from_defaults().is_none());
	}

	// Test 2: Single field changed - shows old -> new format
	{
		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""###);
	}

	// Test 3: Multiple fields changed (port same as default, should not appear)
	{
		let config = Config {
			host: "production".to_string(),
			port: 8080, // same as default - should NOT appear
			debug: true,
			database: Database::default(),
		};
		let diff = config.diff_from_defaults().unwrap();
		insta::assert_snapshot!(diff, @r###"
  debug: false -> true
  host: "localhost" -> "production"
  "###);
	}

	// Test 4: Nested config
	{
		let config = Config {
			host: "app-server".to_string(),
			port: 9000,
			debug: false, // same as default
			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
  "###);
	}

	// Test 5: Only nested field changed
	{
		let config = Config {
			database: Database {
				url: "postgres://localhost/db".to_string(),
				max_connections: 0, // same as default
			},
			..Default::default()
		};
		let diff = config.diff_from_defaults().unwrap();
		insta::assert_snapshot!(diff, @r###"database.url: "" -> "postgres://localhost/db""###);
	}
}