@@ -2,32 +2,47 @@ use proc_macro2::{Ident, Span, TokenStream};
22
33pub const ENUMS_PREFIX : & str = "" ;
44
5+ #[ derive( Debug , PartialEq ) ]
6+ pub struct EnumVariant {
7+ pub description : Option < String > ,
8+ pub name : String ,
9+ }
10+
511#[ derive( Debug , PartialEq ) ]
612pub struct GqlEnum {
713 pub description : Option < String > ,
814 pub name : String ,
9- pub variants : Vec < String > ,
15+ pub variants : Vec < EnumVariant > ,
1016}
1117
1218impl GqlEnum {
1319 pub fn to_rust ( & self ) -> TokenStream {
14- let variants : Vec < Ident > = self
20+ let variant_names : Vec < TokenStream > = self
1521 . variants
1622 . 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+ } )
1829 . collect ( ) ;
19- let variants = & variants ;
30+ let variant_names = & variant_names ;
2031 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 ( ) ;
2236 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;
2439
2540 let name = name_ident. clone ( ) ;
2641
2742 quote ! {
2843 #[ derive( Debug ) ]
2944 pub enum #name {
30- #( #variants , ) *
45+ #( #variant_names , ) *
3146 Other ( String ) ,
3247 }
3348
0 commit comments