1use jgenesis_proc_macros::deserialize_default_on_error; 2use serde::Deserialize; 3 4#[deserialize_default_on_error] 5#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)] 6#[serde(default)] 7pub struct Foo { 8 a: u32, 9 b: u32, 10} 11 12impl Default for Foo { 13 fn default() -> Self { 14 Self { a: 5, b: 10 } 15 } 16} 17 18#[test_log::test] 19fn test_deserialize_default_on_error() { 20 assert_eq!(toml::from_str::<Foo>(""), Ok(Foo::default())); 21 22 assert_eq!(toml::from_str::<Foo>("a = 20"), Ok(Foo { a: 20, b: 10 })); 23 24 assert_eq!(toml::from_str::<Foo>("b = 20"), Ok(Foo { a: 5, b: 20 })); 25 26 assert_eq!(toml::from_str::<Foo>("a = \"asdf\""), Ok(Foo { a: 5, b: 10 })); 27 28 assert_eq!(toml::from_str::<Foo>("a = 20\nb = \"asdf\""), Ok(Foo { a: 20, b: 10 })); 29 30 assert_eq!(toml::from_str::<Foo>("a = 20\nb = 30"), Ok(Foo { a: 20, b: 30 })); 31} 32 33#[deserialize_default_on_error] 34#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)] 35#[serde(default)] 36pub struct CfgTest { 37 a: u32, 38 #[cfg(false)] 39 b: u32, 40} 41 42impl Default for CfgTest { 43 fn default() -> Self { 44 Self { a: 5 } 45 } 46} 47 48#[test_log::test] 49fn test_cfg_field() { 50 assert_eq!(toml::from_str("a = \"asdf\""), Ok(CfgTest { a: 5 })); 51}