diff options
Diffstat (limited to 'third_party/rust/rustversion/src/attr.rs')
-rw-r--r-- | third_party/rust/rustversion/src/attr.rs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/third_party/rust/rustversion/src/attr.rs b/third_party/rust/rustversion/src/attr.rs new file mode 100644 index 0000000000..6023d1eaf1 --- /dev/null +++ b/third_party/rust/rustversion/src/attr.rs @@ -0,0 +1,35 @@ +use crate::error::{Error, Result}; +use crate::expr::{self, Expr}; +use crate::{iter, token}; +use proc_macro::{Span, TokenStream}; + +pub struct Args { + pub condition: Expr, + pub then: Then, +} + +pub enum Then { + Const(Span), + Attribute(TokenStream), +} + +pub fn parse(input: TokenStream) -> Result<Args> { + let ref mut input = iter::new(input); + let condition = expr::parse(input)?; + + token::parse_punct(input, ',')?; + if input.peek().is_none() { + return Err(Error::new(Span::call_site(), "expected one or more attrs")); + } + + let const_span = token::parse_optional_keyword(input, "const"); + let then = if let Some(const_span) = const_span { + token::parse_optional_punct(input, ','); + token::parse_end(input)?; + Then::Const(const_span) + } else { + Then::Attribute(input.collect()) + }; + + Ok(Args { condition, then }) +} |