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 { 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); }