Skip to content

Commit 7cc4cc4

Browse files
committed
factor out can_merge method
1 parent bab0bd4 commit 7cc4cc4

File tree

1 file changed

+27
-21
lines changed

1 file changed

+27
-21
lines changed

src/merge.rs

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4955
fn same_arguments<'a, 'b, T>(
5056
arguments_a: &[(T::Value, Value<'a, T>)],
5157
arguments_b: &[(T::Value, Value<'a, T>)],
5258
) -> bool
5359
where
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

Comments
 (0)