sylvia_derive/parser/attributes/
payload.rs

1use proc_macro_error::emit_error;
2use syn::parse::{Parse, ParseStream, Parser};
3use syn::{Error, Ident, MetaList, Result};
4
5/// Type wrapping data parsed from `sv::payload` attribute.
6#[derive(Default, Debug)]
7pub struct PayloadFieldParam;
8
9impl PayloadFieldParam {
10    pub fn new(attr: &MetaList) -> Result<Self> {
11        let data = PayloadFieldParam::parse
12            .parse2(attr.tokens.clone())
13            .map_err(|err| {
14                emit_error!(err.span(), err);
15                err
16            })?;
17
18        Ok(data)
19    }
20}
21
22impl Parse for PayloadFieldParam {
23    fn parse(input: ParseStream) -> Result<Self> {
24        let option: Ident = input.parse()?;
25        match option.to_string().as_str() {
26            "raw" => (),
27            _ => {
28                return Err(Error::new(
29                    option.span(),
30                    "Invalid payload parameter.\n= note: Expected [`raw`].\n",
31                ))
32            }
33        };
34
35        if !input.is_empty() {
36            return Err(Error::new(
37                input.span(),
38                "Unexpected tokens inside `sv::payload` attribute.\n= note: Expected parameters: [`raw`] `.\n",
39            ));
40        }
41
42        Ok(Self)
43    }
44}