@@ -13,45 +13,51 @@ where
1313 let response_key = alias_or_name ( current_field) ;
1414 match merged. get_mut ( & response_key) {
1515 Some ( existing_field) => {
16- if current_field. name != existing_field. name {
17- return Err ( format ! (
18- "Fields `{}` and `{}` are different" ,
19- current_field. name. as_ref( ) ,
20- existing_field. name. as_ref( ) ,
21- ) ) ;
16+ if can_merge ( current_field, existing_field) ? {
17+ existing_field
18+ . selection_set
19+ . items
20+ . extend ( current_field. selection_set . items . iter ( ) . cloned ( ) ) ;
2221 }
23- if !same_arguments ( & current_field. arguments , & existing_field. arguments ) {
24- return Err ( format ! (
25- "Two fields named `{}` have different arguments" ,
26- current_field. name. as_ref( ) ,
27- ) ) ;
28- }
29- existing_field
30- . selection_set
31- . items
32- . extend ( current_field. selection_set . items . iter ( ) . cloned ( ) ) ;
3322 }
3423 None => {
3524 merged. insert ( response_key, ( * current_field) . clone ( ) ) ;
3625 }
3726 }
3827 }
3928
40- let mut fields = vec ! [ ] ;
29+ let fields = merged . into_iter ( ) . map ( | ( _ , field ) | field ) . collect ( ) ;
4130
42- for ( _, field) in merged {
43- fields. push ( field) ;
31+ Ok ( fields)
32+ }
33+
34+ fn can_merge < ' a , T > ( field_a : & Field < ' a , T > , field_b : & Field < ' a , T > ) -> Result < bool , String >
35+ where
36+ T : Text < ' a > + Eq + AsRef < str > ,
37+ {
38+ if field_a. name != field_b. name {
39+ return Err ( format ! (
40+ "Fields `{}` and `{}` are different" ,
41+ field_a. name. as_ref( ) ,
42+ field_b. name. as_ref( ) ,
43+ ) ) ;
44+ }
45+ if !same_arguments ( & field_a. arguments , & field_b. arguments ) {
46+ return Err ( format ! (
47+ "Two fields named `{}` have different arguments" ,
48+ field_a. name. as_ref( ) ,
49+ ) ) ;
4450 }
4551
46- Ok ( fields )
52+ Ok ( true )
4753}
4854
4955fn same_arguments < ' a , ' b , T > (
5056 arguments_a : & [ ( T :: Value , Value < ' a , T > ) ] ,
5157 arguments_b : & [ ( T :: Value , Value < ' a , T > ) ] ,
5258) -> bool
5359where
54- T : Text < ' a > + Eq + AsRef < str > + Clone ,
60+ T : Text < ' a > + Eq + AsRef < str > ,
5561{
5662 if arguments_a. len ( ) != arguments_b. len ( ) {
5763 return false ;
0 commit comments