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