use darling::FromTypeParam; use syn::{parse_quote, DeriveInput, GenericParam, Ident, TypeParam}; #[derive(FromTypeParam)] #[darling(attributes(lorem), from_ident)] struct Lorem { ident: Ident, bounds: Vec, foo: bool, bar: Option, } impl From for Lorem { fn from(ident: Ident) -> Self { Lorem { ident, foo: false, bar: None, bounds: Default::default(), } } } fn extract_type(param: &GenericParam) -> &TypeParam { match *param { GenericParam::Type(ref ty) => ty, _ => unreachable!("Not a type param"), } } #[test] #[allow(clippy::bool_assert_comparison)] fn expand_many() { let di: DeriveInput = parse_quote! { struct Baz< #[lorem(foo)] T, #[lorem(bar = "x")] U: Eq + ?Sized >(T, U); }; let params = di.generics.params; { let ty = extract_type(¶ms[0]); let lorem = Lorem::from_type_param(ty).unwrap(); assert_eq!(lorem.ident, "T"); assert_eq!(lorem.foo, true); assert_eq!(lorem.bar, None); } { let ty = extract_type(¶ms[1]); let lorem = Lorem::from_type_param(ty).unwrap(); assert_eq!(lorem.ident, "U"); assert_eq!(lorem.foo, false); assert_eq!(lorem.bar, Some("x".to_string())); assert_eq!(lorem.bounds.len(), 2); } }