Nested dotted-table enums (#329)

Add support for deserializing enums from nested dotted tables.
This commit is contained in:
James Kay 2019-09-05 15:18:26 +01:00 committed by Alex Crichton
parent 5fef3914cf
commit d083e58357
2 changed files with 52 additions and 1 deletions

View file

@ -541,10 +541,41 @@ impl<'de, 'b> de::Deserializer<'de> for MapVisitor<'de, 'b> {
visitor.visit_newtype_struct(self) visitor.visit_newtype_struct(self)
} }
fn deserialize_enum<V>(
self,
_name: &'static str,
_variants: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Error>
where
V: de::Visitor<'de>,
{
if self.tables.len() != 1 {
return Err(Error::custom(
Some(self.cur),
"enum table must contain exactly one table".into(),
));
}
let table = &mut self.tables[0];
let values = table.values.take().expect("table has no values?");
if table.header.len() == 0 {
return Err(self.de.error(self.cur, ErrorKind::EmptyTableKey));
}
let name = table.header[table.header.len() - 1].to_owned();
visitor.visit_enum(DottedTableDeserializer {
name: name,
value: Value {
e: E::DottedTable(values),
start: 0,
end: 0,
},
})
}
serde::forward_to_deserialize_any! { serde::forward_to_deserialize_any! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
bytes byte_buf map struct unit identifier bytes byte_buf map struct unit identifier
ignored_any unit_struct tuple_struct tuple enum ignored_any unit_struct tuple_struct tuple
} }
} }

View file

@ -2,6 +2,11 @@
extern crate serde_derive; extern crate serde_derive;
extern crate toml; extern crate toml;
#[derive(Debug, Deserialize, PartialEq)]
struct OuterStruct {
inner: TheEnum,
}
#[derive(Debug, Deserialize, PartialEq)] #[derive(Debug, Deserialize, PartialEq)]
enum TheEnum { enum TheEnum {
Plain, Plain,
@ -181,6 +186,21 @@ mod enum_struct {
.unwrap() .unwrap()
); );
} }
#[test]
fn from_nested_dotted_table() {
assert_eq!(
OuterStruct {
inner: TheEnum::Struct { value: -123 }
},
toml::from_str(
r#"[inner.Struct]
value = -123
"#
)
.unwrap()
);
}
} }
mod enum_array { mod enum_array {