1 use darling::FromVariant;
2 use syn::{spanned::Spanned, Expr, ExprLit, LitInt};
3
4 #[derive(FromVariant)]
5 #[darling(from_ident, attributes(hello))]
6 #[allow(dead_code)]
7 pub struct Lorem {
8 ident: syn::Ident,
9 into: Option<bool>,
10 skip: Option<bool>,
11 discriminant: Option<syn::Expr>,
12 fields: darling::ast::Fields<syn::Type>,
13 }
14
15 impl From<syn::Ident> for Lorem {
from(ident: syn::Ident) -> Self16 fn from(ident: syn::Ident) -> Self {
17 Lorem {
18 ident,
19 into: Default::default(),
20 skip: Default::default(),
21 discriminant: None,
22 fields: darling::ast::Style::Unit.into(),
23 }
24 }
25 }
26
27 #[test]
discriminant()28 fn discriminant() {
29 let input: syn::DeriveInput = syn::parse_str(
30 r#"
31 pub enum Test {
32 Works = 1,
33 AlsoWorks = 2,
34 }
35 "#,
36 )
37 .unwrap();
38
39 let span = input.span();
40 if let syn::Data::Enum(enm) = input.data {
41 let lorem = Lorem::from_variant(
42 enm.variants
43 .first()
44 .expect("Hardcoded input has one variant"),
45 )
46 .expect("FromVariant can process the discriminant");
47 assert_eq!(
48 lorem.discriminant,
49 Some(Expr::Lit(ExprLit {
50 attrs: vec![],
51 lit: LitInt::new("1", span).into(),
52 }))
53 )
54 } else {
55 panic!("Data should be enum");
56 }
57 }
58