Skip to content

Commit 163842b

Browse files
committed
graphql_client_codegen: require items referenced from fragments
Fixes: #286
1 parent 74284b2 commit 163842b

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

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)