mockersf / hocon.rs

Parse HOCON configuration files in Rust
MIT License
78 stars 16 forks source link

How can I deserialize an enum in struct? #51

Open yancheng199287 opened 3 years ago

yancheng199287 commented 3 years ago

#[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:
mockersf commented 3 years ago
#[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,
}