aboutsummaryrefslogtreecommitdiff
path: root/rustversion/src/attr.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rustversion/src/attr.rs')
-rw-r--r--rustversion/src/attr.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/rustversion/src/attr.rs b/rustversion/src/attr.rs
new file mode 100644
index 0000000..591b2c0
--- /dev/null
+++ b/rustversion/src/attr.rs
@@ -0,0 +1,35 @@
+use crate::expr::Expr;
+use proc_macro2::TokenStream;
+use syn::parse::{Parse, ParseStream, Result};
+use syn::Token;
+
+pub struct Args {
+ pub condition: Expr,
+ pub then: Then,
+}
+
+pub enum Then {
+ Const(Token![const]),
+ Attribute(TokenStream),
+}
+
+impl Parse for Args {
+ fn parse(input: ParseStream) -> Result<Self> {
+ let condition: Expr = input.parse()?;
+
+ input.parse::<Token![,]>()?;
+ if input.is_empty() {
+ return Err(input.error("expected one or more attrs"));
+ }
+
+ let const_token: Option<Token![const]> = input.parse()?;
+ let then = if let Some(const_token) = const_token {
+ input.parse::<Option<Token![,]>>()?;
+ Then::Const(const_token)
+ } else {
+ input.parse().map(Then::Attribute)?
+ };
+
+ Ok(Args { condition, then })
+ }
+}