diff options
Diffstat (limited to 'src/data.rs')
-rw-r--r-- | src/data.rs | 51 |
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")))] |