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}