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}