bluejay_validator/executable/document/rules/
lone_anonymous_operation.rs1use crate::executable::{
2 document::{Error, Rule, Visitor},
3 Cache,
4};
5use bluejay_core::definition::SchemaDefinition;
6use bluejay_core::executable::{ExecutableDocument, OperationDefinition};
7
8pub struct LoneAnonymousOperation<'a, E: ExecutableDocument> {
9 anonymous_operations: Vec<&'a E::OperationDefinition>,
10 executable_document: &'a E,
11}
12
13impl<'a, E: ExecutableDocument, S: SchemaDefinition> Visitor<'a, E, S>
14 for LoneAnonymousOperation<'a, E>
15{
16 fn new(executable_document: &'a E, _: &'a S, _: &'a Cache<'a, E, S>) -> Self {
17 Self {
18 anonymous_operations: Vec::new(),
19 executable_document,
20 }
21 }
22
23 fn visit_operation_definition(&mut self, operation_definition: &'a E::OperationDefinition) {
24 if operation_definition.as_ref().name().is_none() {
25 self.anonymous_operations.push(operation_definition);
26 }
27 }
28}
29
30impl<'a, E: ExecutableDocument + 'a, S: SchemaDefinition + 'a> Rule<'a, E, S>
31 for LoneAnonymousOperation<'a, E>
32{
33 type Error = Error<'a, E, S>;
34 type Errors = <Option<Error<'a, E, S>> as IntoIterator>::IntoIter;
35
36 fn into_errors(self) -> Self::Errors {
37 (self.executable_document.operation_definitions().count() != 1
38 && !self.anonymous_operations.is_empty())
39 .then_some(Error::NotLoneAnonymousOperation {
40 anonymous_operations: self.anonymous_operations,
41 })
42 .into_iter()
43 }
44}