1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use proc_macro2::TokenStream;
use quote::{TokenStreamExt, ToTokens};
#[derive(Default)]
pub struct ErrorDeclaration {
__hidden: (),
}
impl ToTokens for ErrorDeclaration {
fn to_tokens(&self, tokens: &mut TokenStream) {
tokens.append_all(quote! {
let mut __errors = ::darling::export::Vec::new();
})
}
}
#[derive(Default)]
pub struct ErrorCheck<'a> {
location: Option<&'a str>,
__hidden: (),
}
impl<'a> ErrorCheck<'a> {
pub fn with_location(location: &'a str) -> Self {
ErrorCheck {
location: Some(location),
__hidden: (),
}
}
}
impl<'a> ToTokens for ErrorCheck<'a> {
fn to_tokens(&self, tokens: &mut TokenStream) {
let at_call = if let Some(ref s) = self.location {
quote!(.at(#s))
} else {
quote!()
};
tokens.append_all(quote! {
if !__errors.is_empty() {
return ::darling::export::Err(::darling::Error::multiple(__errors) #at_call);
}
})
}
}