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 bc3c9e1c1..beb896032 100644 --- a/graphql_client_codegen/src/shared.rs +++ b/graphql_client_codegen/src/shared.rs @@ -5,6 +5,11 @@ 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).format("`, `").to_string() +} pub(crate) fn render_object_field( field_name: &str, @@ -77,7 +82,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) + ) + })? .type_ .inner_name_str(); let prefix = format!("{}{}", prefix.to_camel_case(), alias.to_camel_case()); @@ -111,15 +122,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) ) })?; let ty = schema_field.type_.to_rust(