Revision control
Copy as Markdown
Other Tools
use darling::{util::Flag, Error, FromDeriveInput, FromMeta};
use proc_macro2::Ident;
use syn::parse_quote;
#[derive(FromMeta)]
#[darling(and_then = Self::validate)]
struct Vis {
public: Flag,
private: Flag,
}
impl Vis {
fn validate(self) -> darling::Result<Self> {
if self.public.is_present() && self.private.is_present() {
return Err(Error::custom("Cannot be both public and private"));
}
Ok(self)
}
}
#[derive(FromDeriveInput)]
#[darling(attributes(sample))]
#[allow(dead_code)]
struct Example {
ident: Ident,
label: String,
volume: usize,
#[darling(flatten)]
visibility: Vis,
}
#[test]
fn many_errors() {
let e = Example::from_derive_input(&parse_quote! {
#[sample(volume = 10, public, private)]
struct Demo {}
})
.map(|_| "Should have failed")
.unwrap_err();
// We are expecting an error from the Vis::validate method and an error for the
// missing `label` field.
assert_eq!(e.len(), 2);
}