//! When input is split across multiple attributes on one element, //! darling should collapse that into one struct. use darling::{Error, FromDeriveInput}; use syn::parse_quote; #[derive(Debug, FromDeriveInput, PartialEq, Eq)] #[darling(attributes(split))] struct Lorem { foo: String, bar: bool, } #[test] fn split_attributes_accrue_to_instance() { let di = parse_quote! { #[split(foo = "Hello")] #[split(bar)] pub struct Foo; }; let parsed = Lorem::from_derive_input(&di).unwrap(); assert_eq!( parsed, Lorem { foo: "Hello".to_string(), bar: true, } ); } #[test] fn duplicates_across_split_attrs_error() { let di = parse_quote! { #[split(foo = "Hello")] #[split(foo = "World", bar)] pub struct Foo; }; let pr = Lorem::from_derive_input(&di).unwrap_err(); assert!(pr.has_span()); assert_eq!(pr.to_string(), Error::duplicate_field("foo").to_string()); } #[test] fn multiple_errors_accrue_to_instance() { let di = parse_quote! { #[split(foo = "Hello")] #[split(foo = "World")] pub struct Foo; }; let pr = Lorem::from_derive_input(&di); let err: Error = pr.unwrap_err(); assert_eq!(2, err.len()); let mut errs = err.into_iter().peekable(); assert_eq!( errs.peek().unwrap().to_string(), Error::duplicate_field("foo").to_string() ); assert!(errs.next().unwrap().has_span()); assert_eq!( errs.next().unwrap().to_string(), Error::missing_field("bar").to_string() ); assert!(errs.next().is_none()); }