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