async-graphql/src/validation/rules/no_unused_fragments.rs

32 lines
989 B
Rust
Raw Normal View History

2020-03-24 10:54:22 +00:00
use crate::validation::visitor::{Visitor, VisitorContext};
2020-03-09 10:05:52 +00:00
use graphql_parser::query::{Definition, Document, FragmentSpread};
use std::collections::HashSet;
#[derive(Default)]
pub struct NoUnusedFragments<'a> {
spreads: HashSet<&'a str>,
}
impl<'a> Visitor<'a> for NoUnusedFragments<'a> {
2020-03-22 08:45:59 +00:00
fn exit_document(&mut self, ctx: &mut VisitorContext<'a>, doc: &'a Document) {
2020-03-09 10:05:52 +00:00
for d in &doc.definitions {
if let Definition::Fragment(fragment) = d {
if !self.spreads.contains(fragment.name.as_str()) {
ctx.report_error(
vec![fragment.position],
format!(r#"Fragment "{}" is never used"#, fragment.name),
);
}
}
}
}
fn enter_fragment_spread(
&mut self,
2020-03-22 08:45:59 +00:00
_ctx: &mut VisitorContext<'a>,
2020-03-09 10:05:52 +00:00
fragment_spread: &'a FragmentSpread,
) {
self.spreads.insert(&fragment_spread.fragment_name);
}
}