media-io / yaserde

Yet Another Serializer/Deserializer
MIT License
174 stars 58 forks source link

Option are Some by default #175

Open roy-amelie opened 5 months ago

roy-amelie commented 5 months ago
use yaserde_derive::{YaDeserialize, YaSerialize};

#[derive(Debug, Default, Eq, PartialEq, YaDeserialize, YaSerialize)]
pub struct BasePerson {
    #[yaserde(rename = "EyeColor")]
    eye_color: String,
    #[yaserde(rename = "Age")]
    age: u8,
}

#[derive(Debug, Default, Eq, PartialEq, YaDeserialize, YaSerialize)]
pub struct Home {
    #[yaserde(rename = "HasHome")]
    has_home: bool,
    #[yaserde(rename = "HasGarden")]
    has_garden: bool
}

#[derive(Debug, Default, Eq, PartialEq, YaDeserialize, YaSerialize)]
pub struct Car {
    #[yaserde(rename = "CarColor")]
    color: String,
    #[yaserde(rename = "CarBrand")]
    brand: String,
}

#[derive(Debug, Default, Eq, PartialEq, YaDeserialize, YaSerialize)]
pub struct Person {
    #[yaserde(flatten)]
    pub base: BasePerson,
    #[yaserde(flatten)]
    pub home: Home,
    #[yaserde(flatten)]
    pub car: Option<Car>,
}

#[cfg(test)]
mod tests {
    use yaserde::de::from_str;
    use super::*;

    #[test]
    fn deserialize_without_car() {
        let person = r#"<?xml version="1.0" encoding="utf-8"?>
            <Person>
                <EyeColor>brown</EyeColor>
                <Age>25</Age>
                <HasHome>true</HasHome>
                <HasGarden>false</HasGarden>
            </Person>"#;

        let person: Person = from_str(person).unwrap();

        let expected_person = Person {
            base: BasePerson {
                eye_color: "brown".to_owned(),
                age: 25,
            },
            home: Home {
                has_home: true,
                has_garden: false,
            },
            car: None,
        };

        assert_eq!(person, expected_person);
    }
}

This test fails, with the following result

let person = Person {
    base: BasePerson { 
        eye_color: "brown", 
        age: 25 
    }, 
    home: Home { 
        has_home: true, 
        has_garden: false 
    }, 
    car: Some(
        Car { 
            color: "", 
            brand: "" 
         }
    )
}
MarcAntoine-Arnaud commented 5 months ago

@roy-amelie ?