Skip to content

Commit 59b8204

Browse files
committed
graphql_query_derive: improve "no such field" error message
See #97.
1 parent a82359b commit 59b8204

File tree

3 files changed

+13
-4
lines changed

3 files changed

+13
-4
lines changed

graphql_client_codegen/src/interfaces.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ impl GqlInterface {
5959
);
6060

6161
let object_fields =
62-
response_fields_for_selection(&self.fields, query_context, &object_selection, prefix)?;
62+
response_fields_for_selection(&self.name, &self.fields, query_context, &object_selection, prefix)?;
6363

6464
let object_children =
6565
field_impls_for_selection(&self.fields, query_context, &object_selection, prefix)?;

graphql_client_codegen/src/objects.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ impl GqlObject {
142142
selection: &Selection,
143143
prefix: &str,
144144
) -> Result<Vec<TokenStream>, failure::Error> {
145-
response_fields_for_selection(&self.fields, query_context, selection, prefix)
145+
response_fields_for_selection(&self.name, &self.fields, query_context, selection, prefix)
146146
}
147147
}
148148

graphql_client_codegen/src/shared.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use deprecation::{DeprecationStatus, DeprecationStrategy};
22
use failure;
33
use heck::{CamelCase, SnakeCase};
4+
use itertools::Itertools;
45
use objects::GqlObjectField;
56
use proc_macro2::{Ident, Span, TokenStream};
67
use query::QueryContext;
@@ -95,6 +96,7 @@ pub(crate) fn field_impls_for_selection(
9596
}
9697

9798
pub(crate) fn response_fields_for_selection(
99+
type_name: &str,
98100
schema_fields: &[GqlObjectField],
99101
context: &QueryContext,
100102
selection: &Selection,
@@ -110,8 +112,15 @@ pub(crate) fn response_fields_for_selection(
110112

111113
let schema_field = &schema_fields
112114
.iter()
113-
.find(|field| field.name.as_str() == name.as_str())
114-
.ok_or_else(|| format_err!("Could not find field: {}", name.as_str()))?;
115+
.find(|field| &field.name == name)
116+
.ok_or_else(|| {
117+
format_err!(
118+
"Could not find field `{}` on `{}`. Available fields: `{}`.",
119+
name.as_str(),
120+
type_name,
121+
schema_fields.iter().map(|ref field| &field.name).format("`, `"),
122+
)
123+
})?;
115124
let ty = schema_field.type_.to_rust(
116125
context,
117126
&format!("{}{}", prefix.to_camel_case(), alias.to_camel_case()),

0 commit comments

Comments
 (0)