graphql_query/validate/
validate.rs1use super::context::ValidationContext;
2use crate::ast::{ASTContext, Document};
3use crate::error::Result;
4use crate::visit::{ComposedVisitor, VisitNode, Visitor};
5use std::borrow::Borrow;
6
7pub trait ValidationRule<'a>: Visitor<'a, ValidationContext<'a>> + Default {
17 #[inline]
20 fn validate(ctx: &'a ASTContext, document: &'a Document<'a>) -> Result<()> {
21 let mut validation = ValidationContext::new(ctx);
22 let mut visitor = Self::default();
23 document.visit(&mut validation, &mut visitor);
24 validation.to_result()
25 }
26}
27
28impl<'a, A, B> Default for ComposedVisitor<'a, ValidationContext<'a>, A, B>
29where
30 A: ValidationRule<'a>,
31 B: ValidationRule<'a>,
32{
33 #[inline]
34 fn default() -> Self {
35 ComposedVisitor::new(A::default(), B::default())
36 }
37}
38
39impl<'a, A, B> ValidationRule<'a> for ComposedVisitor<'a, ValidationContext<'a>, A, B>
40where
41 A: ValidationRule<'a>,
42 B: ValidationRule<'a>,
43{
44}
45
46pub trait ValidateNode<'a>
48where
49 Self: Borrow<Document<'a>>,
50{
51 #[inline]
56 fn validate<Rule: ValidationRule<'a>>(&'a self, ctx: &'a ASTContext) -> Result<()> {
57 Rule::validate(ctx, self.borrow())
58 }
59}
60
61impl<'a> ValidateNode<'a> for Document<'a> {}