1 use proc_macro2::TokenStream; 2 use quote::{quote, ToTokens, TokenStreamExt}; 3 4 /// Declares the local variable into which errors will be accumulated. 5 #[derive(Default)] 6 pub struct ErrorDeclaration { 7 __hidden: (), 8 } 9 10 impl ToTokens for ErrorDeclaration { to_tokens(&self, tokens: &mut TokenStream)11 fn to_tokens(&self, tokens: &mut TokenStream) { 12 tokens.append_all(quote! { 13 let mut __errors = ::darling::Error::accumulator(); 14 }) 15 } 16 } 17 18 /// Returns early if attribute or body parsing has caused any errors. 19 #[derive(Default)] 20 pub struct ErrorCheck<'a> { 21 location: Option<&'a str>, 22 __hidden: (), 23 } 24 25 impl<'a> ErrorCheck<'a> { with_location(location: &'a str) -> Self26 pub fn with_location(location: &'a str) -> Self { 27 ErrorCheck { 28 location: Some(location), 29 __hidden: (), 30 } 31 } 32 } 33 34 impl<'a> ToTokens for ErrorCheck<'a> { to_tokens(&self, tokens: &mut TokenStream)35 fn to_tokens(&self, tokens: &mut TokenStream) { 36 let at_call = if let Some(ref s) = self.location { 37 quote!(.map_err(|e| e.at(#s))) 38 } else { 39 quote!() 40 }; 41 42 tokens.append_all(quote! { 43 __errors.finish() #at_call?; 44 }) 45 } 46 } 47