@@ -2,32 +2,47 @@ use proc_macro2::{Ident, Span, TokenStream};
2
2
3
3
pub const ENUMS_PREFIX : & str = "" ;
4
4
5
+ #[ derive( Debug , PartialEq ) ]
6
+ pub struct EnumVariant {
7
+ pub description : Option < String > ,
8
+ pub name : String ,
9
+ }
10
+
5
11
#[ derive( Debug , PartialEq ) ]
6
12
pub struct GqlEnum {
7
13
pub description : Option < String > ,
8
14
pub name : String ,
9
- pub variants : Vec < String > ,
15
+ pub variants : Vec < EnumVariant > ,
10
16
}
11
17
12
18
impl GqlEnum {
13
19
pub fn to_rust ( & self ) -> TokenStream {
14
- let variants : Vec < Ident > = self
20
+ let variant_names : Vec < TokenStream > = self
15
21
. variants
16
22
. iter ( )
17
- . map ( |v| Ident :: new ( v, Span :: call_site ( ) ) )
23
+ . map ( |v| {
24
+ let name = Ident :: new ( & v. name , Span :: call_site ( ) ) ;
25
+ let description = & v. description ;
26
+ let description = description. as_ref ( ) . map ( |d| quote ! ( #[ doc = #d] ) ) ;
27
+ quote ! ( #description #name)
28
+ } )
18
29
. collect ( ) ;
19
- let variants = & variants ;
30
+ let variant_names = & variant_names ;
20
31
let name_ident = Ident :: new ( & format ! ( "{}{}" , ENUMS_PREFIX , self . name) , Span :: call_site ( ) ) ;
21
- let constructors: Vec < _ > = variants. iter ( ) . map ( |v| quote ! ( #name_ident:: #v) ) . collect ( ) ;
32
+ let constructors: Vec < _ > = variant_names
33
+ . iter ( )
34
+ . map ( |v| quote ! ( #name_ident:: #v) )
35
+ . collect ( ) ;
22
36
let constructors = & constructors;
23
- let variant_str = & self . variants ;
37
+ let variant_str: Vec < String > = self . variants . iter ( ) . map ( |v| v. name . clone ( ) ) . collect ( ) ;
38
+ let variant_str = & variant_str;
24
39
25
40
let name = name_ident. clone ( ) ;
26
41
27
42
quote ! {
28
43
#[ derive( Debug ) ]
29
44
pub enum #name {
30
- #( #variants , ) *
45
+ #( #variant_names , ) *
31
46
Other ( String ) ,
32
47
}
33
48
0 commit comments