simple_config 0.135.0

A config language for humans that is not self-describing.
Documentation
#[test]
fn custom_error_has_location() {
	#[derive(Debug,Eq,Ord,PartialEq,PartialOrd)]
	struct Even(u32);

	impl<'d> serde::Deserialize<'d> for Even {
		fn deserialize<D: serde::Deserializer<'d>>(d: D) -> Result<Self, D::Error> {
			let n = u32::deserialize(d)?;
			if n % 2 != 0 {
				return Err(serde::de::Error::custom(format!("{} is not even", n)));
			}
			Ok(Even(n))
		}
	}

	#[derive(Debug,serde::Deserialize)]
	struct Test {
		_a: Even,
		_b: Even,
	}

	let e = crate::from_bytes::<Test, _>("\
_a: 2
_b: 3
").unwrap_err();
	assert_eq!(e.to_string(), "3 is not even at 2:4");

	let e = crate::from_bytes::<Even, _>("5").unwrap_err();
	assert_eq!(e.to_string(), "5 is not even at 1:1");

	let e = crate::from_bytes::<Vec<Even>, _>("\
2
4
7
8
").unwrap_err();
	assert_eq!(e.to_string(), "7 is not even at 3:1");

	#[derive(Debug,serde::Deserialize)]
	#[allow(dead_code)]
	struct OptTest {
		maybe: Option<Even>,
	}
	let e = crate::from_bytes::<OptTest, _>("\
maybe: 9
").unwrap_err();
	assert_eq!(e.to_string(), "9 is not even at 1:7");

	#[derive(Debug,serde::Deserialize)]
	#[allow(dead_code)]
	enum Wrap {
		V(Even),
	}
	let e = crate::from_bytes::<Wrap, _>("\
V: 11
").unwrap_err();
	assert_eq!(e.to_string(), "11 is not even at 1:3");

	let e = crate::from_bytes::<std::collections::BTreeMap<Even, u32>, _>("\
2: 0
13: 0
").unwrap_err();
	assert_eq!(e.to_string(), "13 is not even at 2:1");
}

#[test]
fn empty_struct() {
	#[derive(Debug,PartialEq,serde::Deserialize)]
	struct Test {
		#[serde(default)]
		list: Vec<i32>,
		#[serde(default)]
		number: Option<u8>,
		#[serde(default)]
		string: String,
		#[serde(default)]
		unit: (),
	}

	let t: Test = crate::from_bytes("").unwrap();
	assert_eq!(t, Test{
		list: Default::default(),
		number: Default::default(),
		string: Default::default(),
		unit: Default::default(),
	});

	let t: String = crate::from_bytes(" ").unwrap();
	assert_eq!(t, "");

	let t: Vec<u8> = crate::from_bytes(" \n  \n \n  \n\n \n").unwrap();
	assert_eq!(t, vec![]);
}