-
Notifications
You must be signed in to change notification settings - Fork 138
Closed as not planned
Closed as not planned
Copy link
Description
Hi! Sorry for the issue name, I cannot find a better description. Anyway, there is some weirdness with untagged enum variants. Probably the best description is the contrived example below.
The deserialization works if there is a space(or any other character that does not break it in other ways really, like comments, non default fields etc). The fact that Second( )
deserializes correctly but Second()
does not seems extremely weird to me. This fails with Err(SpannedError { code: Message("data did not match any variant of untagged enum Foo"), position: Position { line: 1, col: 9 } })
this is on version 0.10.1
#![allow(dead_code)]
use serde::Deserialize;
#[derive(Deserialize, Eq, PartialEq, Debug)]
#[serde(untagged)]
enum Foo {
A(String),
B(Bar),
}
#[derive(Deserialize, Eq, PartialEq, Debug)]
enum Bar {
First,
Second(Baz),
}
#[derive(Deserialize, Eq, PartialEq, Debug)]
struct Baz {
#[serde(default)]
first: String,
#[serde(default)]
second: String,
}
fn main() {
let a: Result<Foo, _> = ron::de::from_str("\"test\"");
let b: Result<Foo, _> = ron::de::from_str("Second(first: \"value\")");
let c: Result<Foo, _> = ron::de::from_str("Second( )");
let d: Result<Foo, _> = ron::de::from_str("Second()");
assert_eq!(a, Ok(Foo::A("test".to_owned()))); // Ok
assert_eq!(b, Ok(Foo::B(Bar::Second(Baz { first: "value".to_owned(), second: "".to_owned() })))); // Ok
assert_eq!(c, Ok(Foo::B(Bar::Second(Baz { first: "".to_owned(), second: "".to_owned() })))); // Ok
assert_eq!(d, Ok(Foo::B(Bar::Second(Baz { first: "".to_owned(), second: "".to_owned() })))); // This errors
}
Metadata
Metadata
Assignees
Labels
No labels