Skip to content

Commit 183489e

Browse files
authored
Merge pull request #288 from mathstuf/fragment-chains
Fragment chains
2 parents b54610a + 08bab24 commit 183489e

File tree

6 files changed

+37
-1
lines changed

6 files changed

+37
-1
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use graphql_client::*;
2+
3+
#[allow(dead_code)]
4+
#[derive(GraphQLQuery)]
5+
#[graphql(
6+
schema_path = "tests/fragment_chain/schema.graphql",
7+
query_path = "tests/fragment_chain/query.graphql"
8+
)]
9+
struct Q;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
query Q {
2+
...FragmentB
3+
}
4+
5+
fragment FragmentB on Query {
6+
...FragmentA
7+
}
8+
9+
fragment FragmentA on Query {
10+
x
11+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
type Query {
2+
x: String
3+
}

graphql_client_codegen/src/fragments.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,9 @@ impl<'query> GqlFragment<'query> {
5656
pub(crate) fn is_recursive(&self) -> bool {
5757
self.selection.contains_fragment(&self.name)
5858
}
59+
60+
pub(crate) fn require<'schema>(&self, context: &QueryContext<'query, 'schema>) {
61+
self.is_required.set(true);
62+
self.selection.require_items(context);
63+
}
5964
}

graphql_client_codegen/src/query.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ impl<'query, 'schema> QueryContext<'query, 'schema> {
4040
/// Mark a fragment as required, so code is actually generated for it.
4141
pub(crate) fn require_fragment(&self, typename_: &str) {
4242
if let Some(fragment) = self.fragments.get(typename_) {
43-
fragment.is_required.set(true)
43+
fragment.require(&self);
4444
}
4545
}
4646

graphql_client_codegen/src/selection.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,14 @@ impl<'query> Selection<'query> {
167167
pub(crate) fn len(&self) -> usize {
168168
self.0.len()
169169
}
170+
171+
pub(crate) fn require_items<'s>(&self, context: &crate::query::QueryContext<'query, 's>) {
172+
self.0.iter().for_each(|item| {
173+
if let SelectionItem::FragmentSpread(SelectionFragmentSpread { fragment_name }) = item {
174+
context.require_fragment(fragment_name);
175+
}
176+
})
177+
}
170178
}
171179

172180
impl<'query> std::convert::From<&'query SelectionSet> for Selection<'query> {

0 commit comments

Comments
 (0)