sylvia_derive/parser/attributes/
error.rs

1use proc_macro_error::emit_error;
2use syn::parse::{Parse, ParseStream, Parser};
3use syn::{parse_quote, MetaList, Result, Type};
4
5use crate::crate_module;
6
7/// Type wrapping data parsed from `sv::error` attribute.
8#[derive(Debug)]
9pub struct ContractErrorAttr {
10    pub error: Type,
11}
12
13impl Default for ContractErrorAttr {
14    fn default() -> Self {
15        let sylvia = crate_module();
16        Self {
17            error: parse_quote! { #sylvia ::cw_std::StdError },
18        }
19    }
20}
21
22impl ContractErrorAttr {
23    pub fn new(attr: &MetaList) -> Result<Self> {
24        ContractErrorAttr::parse
25            .parse2(attr.tokens.clone())
26            .map_err(|err| {
27                emit_error!(err.span(), err);
28                err
29            })
30    }
31}
32
33impl Parse for ContractErrorAttr {
34    fn parse(input: ParseStream) -> Result<Self> {
35        input.parse().map(|error| Self { error })
36    }
37}