Skip to content

Commit 98e431f

Browse files
committed
Correct handling of raw identifiers async-graphql#195
1 parent c4b292f commit 98e431f

File tree

6 files changed

+100
-12
lines changed

6 files changed

+100
-12
lines changed

async-graphql-derive/src/enum.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::utils::{get_crate_name, get_rustdoc};
33
use inflector::Inflector;
44
use proc_macro::TokenStream;
55
use quote::quote;
6+
use syn::ext::IdentExt;
67
use syn::{Data, DeriveInput, Error, Result};
78

89
pub fn generate(enum_args: &args::Enum, input: &DeriveInput) -> Result<TokenStream> {
@@ -47,7 +48,7 @@ pub fn generate(enum_args: &args::Enum, input: &DeriveInput) -> Result<TokenStre
4748
let gql_item_name = item_args
4849
.name
4950
.take()
50-
.unwrap_or_else(|| variant.ident.to_string().to_screaming_snake_case());
51+
.unwrap_or_else(|| variant.ident.unraw().to_string().to_screaming_snake_case());
5152
let item_deprecation = item_args
5253
.deprecation
5354
.as_ref()

async-graphql-derive/src/input_object.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::utils::{get_crate_name, get_rustdoc};
33
use inflector::Inflector;
44
use proc_macro::TokenStream;
55
use quote::quote;
6+
use syn::ext::IdentExt;
67
use syn::{Data, DeriveInput, Error, Result};
78

89
pub fn generate(object_args: &args::InputObject, input: &DeriveInput) -> Result<TokenStream> {
@@ -53,7 +54,7 @@ pub fn generate(object_args: &args::InputObject, input: &DeriveInput) -> Result<
5354
let validator = &field_args.validator;
5455
let name = field_args
5556
.name
56-
.unwrap_or_else(|| ident.to_string().to_camel_case());
57+
.unwrap_or_else(|| ident.unraw().to_string().to_camel_case());
5758
let desc = field_args
5859
.desc
5960
.as_ref()

async-graphql-derive/src/object.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::utils::{feature_block, get_crate_name, get_param_getter_ident, get_ru
44
use inflector::Inflector;
55
use proc_macro::TokenStream;
66
use quote::quote;
7+
use syn::ext::IdentExt;
78
use syn::{Block, Error, FnArg, ImplItem, ItemImpl, Pat, Result, ReturnType, Type, TypeReference};
89

910
pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<TokenStream> {
@@ -127,7 +128,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
127128
let is_key = all_key || *key;
128129
let name = name
129130
.clone()
130-
.unwrap_or_else(|| ident.ident.to_string().to_camel_case());
131+
.unwrap_or_else(|| ident.ident.unraw().to_string().to_camel_case());
131132

132133
if is_key {
133134
if !keys_str.is_empty() {
@@ -208,7 +209,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
208209
let field_name = field
209210
.name
210211
.clone()
211-
.unwrap_or_else(|| method.sig.ident.to_string().to_camel_case());
212+
.unwrap_or_else(|| method.sig.ident.unraw().to_string().to_camel_case());
212213
let field_desc = field
213214
.desc
214215
.as_ref()
@@ -317,7 +318,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
317318
{
318319
let name = name
319320
.clone()
320-
.unwrap_or_else(|| ident.ident.to_string().to_camel_case());
321+
.unwrap_or_else(|| ident.ident.unraw().to_string().to_camel_case());
321322
let desc = desc
322323
.as_ref()
323324
.map(|s| quote! {Some(#s)})
@@ -488,6 +489,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
488489
}
489490

490491
#[allow(clippy::all, clippy::pedantic)]
492+
#[allow(unused_braces, unused_variables)]
491493
#[#crate_name::async_trait::async_trait]
492494
impl#generics #crate_name::ObjectType for #self_ty #where_clause {
493495
async fn resolve_field(&self, ctx: &#crate_name::Context<'_>) -> #crate_name::Result<#crate_name::serde_json::Value> {
@@ -498,7 +500,6 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
498500
}.into_error(ctx.position()))
499501
}
500502

501-
#[allow(unused_variables)]
502503
async fn find_entity(&self, ctx: &#crate_name::Context<'_>, params: &#crate_name::Value) -> #crate_name::Result<#crate_name::serde_json::Value> {
503504
let params = match params {
504505
#crate_name::Value::Object(params) => params,

async-graphql-derive/src/simple_object.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::utils::{feature_block, get_crate_name, get_rustdoc};
33
use inflector::Inflector;
44
use proc_macro::TokenStream;
55
use quote::quote;
6+
use syn::ext::IdentExt;
67
use syn::{Data, DeriveInput, Error, Fields, Result};
78

89
pub fn generate(object_args: &args::Object, input: &DeriveInput) -> Result<TokenStream> {
@@ -39,10 +40,14 @@ pub fn generate(object_args: &args::Object, input: &DeriveInput) -> Result<Token
3940
if let Some(fields) = fields {
4041
for item in &fields.named {
4142
if let Some(field) = args::Field::parse(&crate_name, &item.attrs)? {
42-
let field_name = field
43-
.name
44-
.clone()
45-
.unwrap_or_else(|| item.ident.as_ref().unwrap().to_string().to_camel_case());
43+
let field_name = field.name.clone().unwrap_or_else(|| {
44+
item.ident
45+
.as_ref()
46+
.unwrap()
47+
.unraw()
48+
.to_string()
49+
.to_camel_case()
50+
});
4651
let field_desc = field
4752
.desc
4853
.as_ref()

async-graphql-derive/src/subscription.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::utils::{feature_block, get_crate_name, get_param_getter_ident, get_ru
44
use inflector::Inflector;
55
use proc_macro::TokenStream;
66
use quote::quote;
7+
use syn::ext::IdentExt;
78
use syn::{
89
Block, Error, FnArg, ImplItem, ItemImpl, Pat, Result, ReturnType, Type, TypeImplTrait,
910
TypeReference,
@@ -47,7 +48,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
4748
let field_name = field
4849
.name
4950
.clone()
50-
.unwrap_or_else(|| method.sig.ident.to_string().to_camel_case());
51+
.unwrap_or_else(|| method.sig.ident.unraw().to_string().to_camel_case());
5152
let field_desc = field
5253
.desc
5354
.as_ref()
@@ -149,7 +150,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
149150
{
150151
let name = name
151152
.clone()
152-
.unwrap_or_else(|| ident.ident.to_string().to_camel_case());
153+
.unwrap_or_else(|| ident.ident.unraw().to_string().to_camel_case());
153154
let desc = desc
154155
.as_ref()
155156
.map(|s| quote! {Some(#s)})

tests/raw_ident.rs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
use async_graphql::*;
2+
use futures::{Stream, StreamExt};
3+
4+
#[async_std::test]
5+
pub async fn test_input_value_custom_error() {
6+
#[Enum]
7+
#[allow(non_camel_case_types)]
8+
enum MyEnum {
9+
r#type,
10+
}
11+
12+
#[SimpleObject]
13+
struct MyObject {
14+
r#i32: i32,
15+
}
16+
17+
#[InputObject]
18+
struct MyInputObject {
19+
r#i32: i32,
20+
}
21+
22+
struct Query;
23+
24+
#[Object]
25+
impl Query {
26+
async fn r#type(&self, r#i32: i32) -> i32 {
27+
r#i32
28+
}
29+
30+
async fn obj(&self, obj: MyInputObject) -> MyObject {
31+
MyObject { r#i32: obj.r#i32 }
32+
}
33+
34+
async fn enum_value(&self, value: MyEnum) -> MyEnum {
35+
value
36+
}
37+
}
38+
39+
struct SubscriptionRoot;
40+
41+
#[Subscription]
42+
impl SubscriptionRoot {
43+
async fn r#type(&self) -> impl Stream<Item = i32> {
44+
futures::stream::iter(0..10)
45+
}
46+
}
47+
48+
let schema = Schema::new(Query, EmptyMutation, SubscriptionRoot);
49+
let query = r#"
50+
{
51+
type(i32: 99)
52+
obj(obj: { i32: 88} ) { i32 }
53+
enumValue(value: TYPE)
54+
}"#;
55+
assert_eq!(
56+
QueryBuilder::new(query)
57+
.execute(&schema)
58+
.await
59+
.unwrap()
60+
.data,
61+
serde_json::json!({
62+
"type": 99,
63+
"obj": { "i32": 88 },
64+
"enumValue": "TYPE",
65+
})
66+
);
67+
68+
let mut stream = schema
69+
.create_subscription_stream("subscription { type }", None, Default::default(), None)
70+
.await
71+
.unwrap();
72+
for i in 0..10 {
73+
assert_eq!(
74+
Some(Ok(serde_json::json!({ "type": i }))),
75+
stream.next().await
76+
);
77+
}
78+
assert!(stream.next().await.is_none());
79+
}

0 commit comments

Comments
 (0)