aboutsummaryrefslogtreecommitdiffstats
path: root/src/data.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/data.rs')
-rw-r--r--src/data.rs51
1 files changed, 31 insertions, 20 deletions
diff --git a/src/data.rs b/src/data.rs
index 731f5a0a..b0258ca0 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -246,29 +246,29 @@ pub mod parsing {
#[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))]
impl Parse for Variant {
fn parse(input: ParseStream) -> Result<Self> {
- let attrs = input.call(Attribute::parse_outer)?;
+ let mut attrs = input.call(Attribute::parse_outer)?;
let _visibility: Visibility = input.parse()?;
+ let ident: Ident = input.parse()?;
+ let fields = if input.peek(token::Brace) {
+ let fields = parse_braced(input, &mut attrs)?;
+ Fields::Named(fields)
+ } else if input.peek(token::Paren) {
+ Fields::Unnamed(input.parse()?)
+ } else {
+ Fields::Unit
+ };
+ let discriminant = if input.peek(Token![=]) {
+ let eq_token: Token![=] = input.parse()?;
+ let discriminant: Expr = input.parse()?;
+ Some((eq_token, discriminant))
+ } else {
+ None
+ };
Ok(Variant {
attrs,
- ident: input.parse()?,
- fields: {
- if input.peek(token::Brace) {
- Fields::Named(input.parse()?)
- } else if input.peek(token::Paren) {
- Fields::Unnamed(input.parse()?)
- } else {
- Fields::Unit
- }
- },
- discriminant: {
- if input.peek(Token![=]) {
- let eq_token: Token![=] = input.parse()?;
- let discriminant: Expr = input.parse()?;
- Some((eq_token, discriminant))
- } else {
- None
- }
- },
+ ident,
+ fields,
+ discriminant,
})
}
}
@@ -295,6 +295,17 @@ pub mod parsing {
}
}
+ pub(crate) fn parse_braced(
+ input: ParseStream,
+ attrs: &mut Vec<Attribute>,
+ ) -> Result<FieldsNamed> {
+ let content;
+ let brace_token = braced!(content in input);
+ attr::parsing::parse_inner(&content, attrs)?;
+ let named = content.parse_terminated(Field::parse_named)?;
+ Ok(FieldsNamed { brace_token, named })
+ }
+
impl Field {
/// Parses a named (braced struct) field.
#[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))]