serde-ignored-fields 0.1.1

preserve ignored fields with serde
Documentation
#![cfg(feature = "toml")]

use assert2::{assert, let_assert};
use indoc::indoc;
use serde_ignored_fields::PreserveIgnoredFields;

#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
struct Person {
	name: String,
	hobby: String,
}

fn toml<T: serde::de::DeserializeOwned>(data: &str) -> Result<PreserveIgnoredFields<T, toml::Table>, toml::de::Error> {
	serde::Deserialize::deserialize(toml::Deserializer::new(data))
}

#[test]
fn deserialize_extra() {
	let_assert!(Ok(deserialized) = toml::<Person>(r#"
		name = "Zohan"
		hobby = "hair-dressing"
		glasses = false
		friends = [
			{name = "Scrappy", species = "dog"},
			{name = "Coco", species = "dog"},
		]
	"#));

	assert!(deserialized.value == Person {
		name: "Zohan".into(),
		hobby: "hair-dressing".into(),
	});

	assert!(deserialized.ignored_fields == toml::toml! {
		glasses = false
		friends = [
			{name = "Scrappy", species = "dog"},
			{name = "Coco", species = "dog"},
		]
	});
}

#[test]
fn serialize_extra() {
	let value = PreserveIgnoredFields {
		value: Person {
			name: "Zohan".to_string(),
			hobby: "hair-dressing".to_string(),
		},
		ignored_fields: toml::toml! {
			glasses = false
			friends = [
				{name = "Scrappy", species = "dog"},
				{name = "Coco", species = "dog"},
			]
		}
	};

	let_assert!(Ok(serialized) = ::toml::to_string_pretty(&value));
	assert!(serialized == indoc!(r#"
		name = "Zohan"
		hobby = "hair-dressing"
		glasses = false

		[[friends]]
		name = "Scrappy"
		species = "dog"

		[[friends]]
		name = "Coco"
		species = "dog"
	"#))
}