sylvia_derive/parser/attributes/
features.rs1use proc_macro_error::emit_error;
2use syn::parse::{Parse, ParseStream, Parser};
3use syn::{Error, Ident, MetaList, Result, Token};
4
5#[derive(Debug, Default)]
7pub struct SylviaFeatures {
8 pub replies: bool,
10}
11
12impl SylviaFeatures {
13 pub fn new(attr: &MetaList) -> Result<Self> {
14 SylviaFeatures::parse
15 .parse2(attr.tokens.clone())
16 .map_err(|err| {
17 emit_error!(err.span(), err);
18 err
19 })
20 }
21}
22
23impl Parse for SylviaFeatures {
24 fn parse(input: ParseStream) -> Result<Self> {
25 let mut features = Self::default();
26
27 while !input.is_empty() {
28 let feature: Ident = input.parse()?;
29 match feature.to_string().as_str() {
30 "replies" => features.replies = true,
31 _ => {
32 return Err(Error::new(
33 feature.span(),
34 "Invalid feature.\n= note: Supported features for contract macro: [`replies`].\n",
35 ))
36 }
37 }
38 if !input.peek(Token![,]) {
39 break;
40 }
41 let _: Token![,] = input.parse()?;
42 }
43
44 Ok(features)
45 }
46}