Skip to content

Commit 12175af

Browse files
committed
Add docs on enum variants
1 parent 102dce0 commit 12175af

File tree

3 files changed

+40
-13
lines changed

3 files changed

+40
-13
lines changed

graphql_query_derive/src/enums.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,47 @@ use proc_macro2::{Ident, Span, TokenStream};
22

33
pub 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)]
612
pub struct GqlEnum {
713
pub description: Option<String>,
814
pub name: String,
9-
pub variants: Vec<String>,
15+
pub variants: Vec<EnumVariant>,
1016
}
1117

1218
impl 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

graphql_query_derive/src/schema.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use enums::GqlEnum;
1+
use enums::{EnumVariant, GqlEnum};
22
use failure;
33
use field_type::FieldType;
44
use fragments::GqlFragment;
@@ -269,7 +269,14 @@ impl ::std::convert::From<graphql_parser::schema::Document> for Schema {
269269
GqlEnum {
270270
name: enm.name.clone(),
271271
description: enm.description,
272-
variants: enm.values.iter().map(|v| v.name.clone()).collect(),
272+
variants: enm
273+
.values
274+
.iter()
275+
.map(|v| EnumVariant {
276+
description: v.description.clone(),
277+
name: v.name.clone(),
278+
})
279+
.collect(),
273280
},
274281
);
275282
}
@@ -355,12 +362,17 @@ impl ::std::convert::From<::introspection_response::IntrospectionResponse> for S
355362

356363
match ty.kind {
357364
Some(__TypeKind::ENUM) => {
358-
let variants: Vec<String> = ty
365+
let variants: Vec<EnumVariant> = ty
359366
.enum_values
360367
.clone()
361368
.expect("enum variants")
362369
.iter()
363-
.map(|t| t.clone().map(|t| t.name.expect("enum variant name")))
370+
.map(|t| {
371+
t.clone().map(|t| EnumVariant {
372+
description: t.description,
373+
name: t.name.expect("enum variant name"),
374+
})
375+
})
364376
.filter_map(|t| t)
365377
.collect();
366378
let mut enm = GqlEnum {

graphql_query_derive/src/tests/github.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ fn ast_from_graphql_and_json_produce_the_same_schema() {
3737
{
3838
assert_eq!(json_name, gql_name);
3939
assert_eq!(
40-
HashSet::<&String>::from_iter(json_value.variants.iter()),
41-
HashSet::<&String>::from_iter(gql_value.variants.iter()),
40+
HashSet::<&String>::from_iter(json_value.variants.iter().map(|v| &v.name)),
41+
HashSet::<&String>::from_iter(gql_value.variants.iter().map(|v| &v.name)),
4242
);
4343
}
4444
}

0 commit comments

Comments
 (0)