66#ifndef VALIDATION_H
77#define VALIDATION_H
88
9+ #include " graphqlservice/GraphQLSchema.h"
910#include " graphqlservice/GraphQLService.h"
10- #include " graphqlservice/IntrospectionSchema.h"
1111
1212namespace graphql ::service {
1313
14- using ValidateType = response::Value;
14+ using ValidateType = std::optional<std::reference_wrapper<const schema::BaseType>>;
15+ using SharedType = std::shared_ptr<const schema::BaseType>;
16+
17+ SharedType getSharedType (const ValidateType& type) noexcept ;
18+ ValidateType getValidateType (const SharedType& type) noexcept ;
1519
1620struct ValidateArgument
1721{
@@ -20,15 +24,15 @@ struct ValidateArgument
2024 ValidateType type;
2125};
2226
23- using ValidateTypeFieldArguments = std::map<std::string , ValidateArgument>;
27+ using ValidateTypeFieldArguments = std::map<std::string_view , ValidateArgument>;
2428
2529struct ValidateTypeField
2630{
2731 ValidateType returnType;
2832 ValidateTypeFieldArguments arguments;
2933};
3034
31- using ValidateDirectiveArguments = std::map<std::string , ValidateArgument>;
35+ using ValidateDirectiveArguments = std::map<std::string_view , ValidateArgument>;
3236
3337struct ValidateDirective
3438{
@@ -40,14 +44,14 @@ struct ValidateArgumentVariable
4044{
4145 bool operator ==(const ValidateArgumentVariable& other) const ;
4246
43- std::string name;
47+ std::string_view name;
4448};
4549
4650struct ValidateArgumentEnumValue
4751{
4852 bool operator ==(const ValidateArgumentEnumValue& other) const ;
4953
50- std::string value;
54+ std::string_view value;
5155};
5256
5357struct ValidateArgumentValue ;
@@ -71,7 +75,7 @@ struct ValidateArgumentMap
7175{
7276 bool operator ==(const ValidateArgumentMap& other) const ;
7377
74- std::map<std::string , ValidateArgumentValuePtr> values;
78+ std::map<std::string_view , ValidateArgumentValuePtr> values;
7579};
7680
7781using ValidateArgumentVariant = std::variant<ValidateArgumentVariable, response::IntType,
@@ -118,29 +122,30 @@ class ValidateArgumentValueVisitor
118122 std::vector<schema_error>& _errors;
119123};
120124
121- using ValidateFieldArguments = std::map<std::string , ValidateArgumentValuePtr>;
125+ using ValidateFieldArguments = std::map<std::string_view , ValidateArgumentValuePtr>;
122126
123127struct ValidateField
124128{
125- ValidateField (std::string && returnType, std::optional<std::string> && objectType,
126- const std::string& fieldName, ValidateFieldArguments&& arguments);
129+ ValidateField (ValidateType && returnType, ValidateType && objectType, std::string_view fieldName ,
130+ ValidateFieldArguments&& arguments);
127131
128132 bool operator ==(const ValidateField& other) const ;
129133
130- std::string returnType;
131- std::optional<std::string> objectType;
132- std::string fieldName;
134+ ValidateType returnType;
135+ ValidateType objectType;
136+ std::string_view fieldName;
133137 ValidateFieldArguments arguments;
134138};
135139
136- using ValidateTypeKinds = std::map<std::string, introspection::TypeKind >;
140+ using ValidateTypes = std::map<std::string_view, ValidateType >;
137141
138142// ValidateVariableTypeVisitor visits the AST and builds a ValidateType structure representing
139143// a variable type in an operation definition as if it came from an Introspection query.
140144class ValidateVariableTypeVisitor
141145{
142146public:
143- ValidateVariableTypeVisitor (const ValidateTypeKinds& typeKinds);
147+ ValidateVariableTypeVisitor (
148+ const std::shared_ptr<schema::Schema>& schema, const ValidateTypes& types);
144149
145150 void visit (const peg::ast_node& typeName);
146151
@@ -152,7 +157,8 @@ class ValidateVariableTypeVisitor
152157 void visitListType (const peg::ast_node& listType);
153158 void visitNonNullType (const peg::ast_node& nonNullType);
154159
155- const ValidateTypeKinds& _typeKinds;
160+ const std::shared_ptr<schema::Schema>& _schema;
161+ const ValidateTypes& _types;
156162
157163 bool _isInputType = false ;
158164 ValidateType _variableType;
@@ -163,38 +169,34 @@ class ValidateVariableTypeVisitor
163169class ValidateExecutableVisitor
164170{
165171public:
166- ValidateExecutableVisitor (const Request& service );
172+ ValidateExecutableVisitor (const std::shared_ptr<schema::Schema>& schema );
167173
168174 void visit (const peg::ast_node& root);
169175
170176 std::vector<schema_error> getStructuredErrors ();
171177
172178private:
173- response::Value executeQuery (std::string_view query) const ;
174-
175- static ValidateTypeFieldArguments getArguments (response::ListType&& argumentsMember);
179+ static ValidateTypeFieldArguments getArguments (
180+ const std::vector<std::shared_ptr<const schema::InputValue>>& args);
176181
177- using FieldTypes = std::map<std::string , ValidateTypeField>;
178- using TypeFields = std::map<std::string , FieldTypes>;
182+ using FieldTypes = std::map<std::string_view , ValidateTypeField>;
183+ using TypeFields = std::map<std::string_view , FieldTypes>;
179184 using InputFieldTypes = ValidateTypeFieldArguments;
180- using InputTypeFields = std::map<std::string , InputFieldTypes>;
181- using EnumValues = std::map<std::string , std::set<std::string >>;
185+ using InputTypeFields = std::map<std::string_view , InputFieldTypes>;
186+ using EnumValues = std::map<std::string_view , std::set<std::string_view >>;
182187
183- std::optional<introspection::TypeKind> getTypeKind (const std::string& name) const ;
184- std::optional<introspection::TypeKind> getScopedTypeKind () const ;
185188 constexpr bool isScalarType (introspection::TypeKind kind);
186189
187- bool matchesScopedType (const std::string& name) const ;
190+ bool matchesScopedType (std::string_view name) const ;
188191
189192 TypeFields::const_iterator getScopedTypeFields ();
190- InputTypeFields::const_iterator getInputTypeFields (const std::string& name);
193+ InputTypeFields::const_iterator getInputTypeFields (std::string_view name);
191194 static const ValidateType& getValidateFieldType (const FieldTypes::mapped_type& value);
192195 static const ValidateType& getValidateFieldType (const InputFieldTypes::mapped_type& value);
193196 template <class _FieldTypes >
194- static std::string getFieldType (const _FieldTypes& fields, const std::string& name);
197+ static ValidateType getFieldType (const _FieldTypes& fields, std::string_view name);
195198 template <class _FieldTypes >
196- static std::string getWrappedFieldType (const _FieldTypes& fields, const std::string& name);
197- static std::string getWrappedFieldType (const ValidateType& returnType);
199+ static ValidateType getWrappedFieldType (const _FieldTypes& fields, std::string_view name);
198200
199201 void visitFragmentDefinition (const peg::ast_node& fragmentDefinition);
200202 void visitOperationDefinition (const peg::ast_node& operationDefinition);
@@ -213,23 +215,22 @@ class ValidateExecutableVisitor
213215 bool validateVariableType (bool isNonNull, const ValidateType& variableType,
214216 const schema_location& position, const ValidateType& inputType);
215217
216- const Request& _service ;
218+ const std::shared_ptr<schema::Schema> _schema ;
217219 std::vector<schema_error> _errors;
218220
219- using OperationTypes = std::map<std::string_view, std::string>;
220- using Directives = std::map<std::string, ValidateDirective>;
221- using ExecutableNodes = std::map<std::string, const peg::ast_node&>;
222- using FragmentSet = std::unordered_set<std::string>;
223- using MatchingTypes = std::map<std::string, std::set<std::string>>;
224- using ScalarTypes = std::set<std::string>;
225- using VariableDefinitions = std::map<std::string, const peg::ast_node&>;
226- using VariableTypes = std::map<std::string, ValidateArgument>;
221+ using Directives = std::map<std::string_view, ValidateDirective>;
222+ using ExecutableNodes = std::map<std::string_view, const peg::ast_node&>;
223+ using FragmentSet = std::unordered_set<std::string_view>;
224+ using MatchingTypes = std::map<std::string_view, std::set<std::string_view>>;
225+ using ScalarTypes = std::set<std::string_view>;
226+ using VariableDefinitions = std::map<std::string_view, const peg::ast_node&>;
227+ using VariableTypes = std::map<std::string_view, ValidateArgument>;
227228 using OperationVariables = std::optional<VariableTypes>;
228- using VariableSet = std::set<std::string >;
229+ using VariableSet = std::set<std::string_view >;
229230
230231 // These members store Introspection schema information which does not change between queries.
231- OperationTypes _operationTypes;
232- ValidateTypeKinds _typeKinds ;
232+ ValidateTypes _operationTypes;
233+ ValidateTypes _types ;
233234 MatchingTypes _matchingTypes;
234235 Directives _directives;
235236 EnumValues _enumValues;
@@ -250,8 +251,8 @@ class ValidateExecutableVisitor
250251 size_t _fieldCount = 0 ;
251252 TypeFields _typeFields;
252253 InputTypeFields _inputTypeFields;
253- std::string _scopedType;
254- std::map<std::string , ValidateField> _selectionFields;
254+ ValidateType _scopedType;
255+ std::map<std::string_view , ValidateField> _selectionFields;
255256};
256257
257258} /* namespace graphql::service */
0 commit comments