-
-
Notifications
You must be signed in to change notification settings - Fork 919
/
DocumentValidator.cs
97 lines (87 loc) · 2.9 KB
/
DocumentValidator.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System.Collections.Generic;
using System.Linq;
using GraphQL.Language.AST;
using GraphQL.Types;
using GraphQL.Validation.Rules;
namespace GraphQL.Validation
{
public interface IDocumentValidator
{
IValidationResult Validate(
string originalQuery,
ISchema schema,
Document document,
IEnumerable<IValidationRule> rules = null,
object userContext = null,
Inputs inputs = null);
}
public class DocumentValidator : IDocumentValidator
{
public IValidationResult Validate(
string originalQuery,
ISchema schema,
Document document,
IEnumerable<IValidationRule> rules = null,
object userContext = null,
Inputs inputs = null)
{
if (!schema.Initialized)
{
schema.Initialize();
}
var context = new ValidationContext
{
OriginalQuery = originalQuery,
Schema = schema,
Document = document,
TypeInfo = new TypeInfo(schema),
UserContext = userContext,
Inputs = inputs
};
if (rules == null)
{
rules = CoreRules();
}
var visitors = rules.Select(x => x.Validate(context)).ToList();
visitors.Insert(0, context.TypeInfo);
// #if DEBUG
// visitors.Insert(1, new DebugNodeVisitor());
// #endif
var basic = new BasicVisitor(visitors.ToArray());
basic.Visit(document);
var result = new ValidationResult();
result.Errors.AddRange(context.Errors);
return result;
}
public static List<IValidationRule> CoreRules()
{
var rules = new List<IValidationRule>
{
new UniqueOperationNames(),
new LoneAnonymousOperation(),
new KnownTypeNames(),
new FragmentsOnCompositeTypes(),
new VariablesAreInputTypes(),
new ScalarLeafs(),
new FieldsOnCorrectType(),
new UniqueFragmentNames(),
new KnownFragmentNames(),
new NoUnusedFragments(),
new PossibleFragmentSpreads(),
new NoFragmentCycles(),
new NoUndefinedVariables(),
new NoUnusedVariables(),
new UniqueVariableNames(),
new KnownDirectives(),
new KnownArgumentNames(),
new UniqueArgumentNames(),
new ArgumentsOfCorrectType(),
new ProvidedNonNullArguments(),
new DefaultValuesOfCorrectType(),
new VariablesInAllowedPosition(),
new UniqueInputFieldNames()
};
return rules;
}
}
}