sylvia_derive/parser/attributes/
features.rs

1use proc_macro_error::emit_error;
2use syn::parse::{Parse, ParseStream, Parser};
3use syn::{Error, Ident, MetaList, Result, Token};
4
5/// Type wrapping data parsed from `sv::features` attribute.
6#[derive(Debug, Default)]
7pub struct SylviaFeatures {
8    /// Enables better dispatching and deserialization for replies.
9    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}