Nested dotted-table enums (#329)
Add support for deserializing enums from nested dotted tables.
This commit is contained in:
parent
5fef3914cf
commit
d083e58357
33
src/de.rs
33
src/de.rs
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue