hocon.rs icon indicating copy to clipboard operation
hocon.rs copied to clipboard

How can I deserialize an enum in struct?

Open yancheng199287 opened this issue 4 years ago • 1 comments
trafficstars


#[derive(Debug,Deserialize)]
enum RoleType {
    Admin,
    User,
    VipUser,
}

#[derive(Debug, Deserialize)]
struct User {
    name: String,
    age: u8,
    weight: u8,
    high: f32,
 #[serde(flatten)]
    role_type:RoleType
}


#[test]
fn test01() {
    let s = r#"{
        name="yancheng"
        age=28
        weight=76
        high=1.77
        role_type="VipUser"
    }"#;

    let user: User = hocon::de::from_str(s).unwrap();

    println!("{:?}", user)
}
called `Result::unwrap()` on an `Err` value: Deserialization { message: ".: no variant of enum RoleType found in flattened data" }
thread 'test01' panicked at 'called `Result::unwrap()` on an `Err` value: Deserialization { message: ".: no variant of enum RoleType found in flattened data" }', examples\hocon_test01.rs:50:45
stack backtrace:


yancheng199287 avatar May 26 '21 02:05 yancheng199287

#[derive(Debug, Deserialize)]
struct User {
    name: String,
    age: u8,
    weight: u8,
    high: f32,
 #[serde(flatten)]
    role_type:RoleType
}

You can't flatten a unit enum like RoleType.

This struct is working:

#[derive(Debug, Deserialize)]
struct User {
    name: String,
    age: u8,
    weight: u8,
    high: f32,
    role_type: RoleType,
}

mockersf avatar May 26 '21 13:05 mockersf