From e1e6e386e8866eebbf3cffcfb1c385b097b45fa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fausto=20N=C3=BA=C3=B1ez=20Alberro?= Date: Sun, 31 Mar 2019 14:10:00 +0200 Subject: [PATCH 1/2] codegen: improve "could not find field" error message --- graphql_client_codegen/src/shared.rs | 31 +++++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/graphql_client_codegen/src/shared.rs b/graphql_client_codegen/src/shared.rs index bc3c9e1c1..94c092baf 100644 --- a/graphql_client_codegen/src/shared.rs +++ b/graphql_client_codegen/src/shared.rs @@ -6,6 +6,19 @@ use proc_macro2::{Ident, Span, TokenStream}; use query::QueryContext; use selection::*; +fn format_available_fields(fields: &[GqlObjectField]) -> String { + fields + .iter() + .map(|ref field| &field.name) + .fold(String::new(), |mut acc, item| { + acc.push_str(item); + acc.push_str(", "); + acc + }) + .trim_end_matches(", ") + .to_owned() +} + pub(crate) fn render_object_field( field_name: &str, field_type: &TokenStream, @@ -77,7 +90,13 @@ pub(crate) fn field_impls_for_selection( let ty = fields .iter() .find(|f| &f.name == name) - .ok_or_else(|| format_err!("could not find field `{}`", name))? + .ok_or_else(|| { + format_err!( + "Could not find field `{}`. Available fields: `{}`.", + name, + format_available_fields(fields).as_str() + ) + })? .type_ .inner_name_str(); let prefix = format!("{}{}", prefix.to_camel_case(), alias.to_camel_case()); @@ -111,15 +130,7 @@ pub(crate) fn response_fields_for_selection( "Could not find field `{}` on `{}`. Available fields: `{}`.", *name, type_name, - schema_fields - .iter() - .map(|ref field| &field.name) - .fold(String::new(), |mut acc, item| { - acc.push_str(item); - acc.push_str(", "); - acc - }) - .trim_end_matches(", ") + format_available_fields(schema_fields).as_str() ) })?; let ty = schema_field.type_.to_rust( From 4523edea9f62de0fc4968b8a9bfa9ed21810534a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fausto=20N=C3=BA=C3=B1ez=20Alberro?= Date: Tue, 2 Apr 2019 23:08:06 +0200 Subject: [PATCH 2/2] to be squashed: use itertools for formatting --- graphql_client_codegen/Cargo.toml | 1 + graphql_client_codegen/src/lib.rs | 1 + graphql_client_codegen/src/shared.rs | 16 ++++------------ 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/graphql_client_codegen/Cargo.toml b/graphql_client_codegen/Cargo.toml index f3beb5626..9020335d7 100644 --- a/graphql_client_codegen/Cargo.toml +++ b/graphql_client_codegen/Cargo.toml @@ -8,6 +8,7 @@ repository = "https://github.com/graphql-rust/graphql-client" [dependencies] failure = "0.1" +itertools = "0.8" lazy_static = "1.0" quote = "0.6" syn = "0.15.20" diff --git a/graphql_client_codegen/src/lib.rs b/graphql_client_codegen/src/lib.rs index 7d42e88ea..0f1e5e5ba 100644 --- a/graphql_client_codegen/src/lib.rs +++ b/graphql_client_codegen/src/lib.rs @@ -9,6 +9,7 @@ extern crate failure; extern crate graphql_parser; extern crate heck; +extern crate itertools; #[macro_use] extern crate lazy_static; extern crate proc_macro; diff --git a/graphql_client_codegen/src/shared.rs b/graphql_client_codegen/src/shared.rs index 94c092baf..beb896032 100644 --- a/graphql_client_codegen/src/shared.rs +++ b/graphql_client_codegen/src/shared.rs @@ -5,18 +5,10 @@ use objects::GqlObjectField; use proc_macro2::{Ident, Span, TokenStream}; use query::QueryContext; use selection::*; +use itertools::Itertools; fn format_available_fields(fields: &[GqlObjectField]) -> String { - fields - .iter() - .map(|ref field| &field.name) - .fold(String::new(), |mut acc, item| { - acc.push_str(item); - acc.push_str(", "); - acc - }) - .trim_end_matches(", ") - .to_owned() + fields.iter().map(|ref field| &field.name).format("`, `").to_string() } pub(crate) fn render_object_field( @@ -94,7 +86,7 @@ pub(crate) fn field_impls_for_selection( format_err!( "Could not find field `{}`. Available fields: `{}`.", name, - format_available_fields(fields).as_str() + format_available_fields(fields) ) })? .type_ @@ -130,7 +122,7 @@ pub(crate) fn response_fields_for_selection( "Could not find field `{}` on `{}`. Available fields: `{}`.", *name, type_name, - format_available_fields(schema_fields).as_str() + format_available_fields(schema_fields) ) })?; let ty = schema_field.type_.to_rust(