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::shared_ptr<schema::BaseType> ;
1515
1616struct ValidateArgument
1717{
@@ -20,15 +20,15 @@ struct ValidateArgument
2020 ValidateType type;
2121};
2222
23- using ValidateTypeFieldArguments = std::map<std::string , ValidateArgument>;
23+ using ValidateTypeFieldArguments = std::map<std::string_view , ValidateArgument>;
2424
2525struct ValidateTypeField
2626{
2727 ValidateType returnType;
2828 ValidateTypeFieldArguments arguments;
2929};
3030
31- using ValidateDirectiveArguments = std::map<std::string , ValidateArgument>;
31+ using ValidateDirectiveArguments = std::map<std::string_view , ValidateArgument>;
3232
3333struct ValidateDirective
3434{
@@ -40,14 +40,14 @@ struct ValidateArgumentVariable
4040{
4141 bool operator ==(const ValidateArgumentVariable& other) const ;
4242
43- std::string name;
43+ std::string_view name;
4444};
4545
4646struct ValidateArgumentEnumValue
4747{
4848 bool operator ==(const ValidateArgumentEnumValue& other) const ;
4949
50- std::string value;
50+ std::string_view value;
5151};
5252
5353struct ValidateArgumentValue ;
@@ -71,7 +71,7 @@ struct ValidateArgumentMap
7171{
7272 bool operator ==(const ValidateArgumentMap& other) const ;
7373
74- std::map<std::string , ValidateArgumentValuePtr> values;
74+ std::map<std::string_view , ValidateArgumentValuePtr> values;
7575};
7676
7777using ValidateArgumentVariant = std::variant<ValidateArgumentVariable, response::IntType,
@@ -118,29 +118,29 @@ class ValidateArgumentValueVisitor
118118 std::vector<schema_error>& _errors;
119119};
120120
121- using ValidateFieldArguments = std::map<std::string , ValidateArgumentValuePtr>;
121+ using ValidateFieldArguments = std::map<std::string_view , ValidateArgumentValuePtr>;
122122
123123struct ValidateField
124124{
125- ValidateField (std::string&& returnType, std::optional<std::string>&& objectType,
126- const std::string& fieldName, ValidateFieldArguments&& arguments);
125+ ValidateField (std::string_view returnType, std::optional<std::string_view> objectType,
126+ std::string_view fieldName, ValidateFieldArguments&& arguments);
127127
128128 bool operator ==(const ValidateField& other) const ;
129129
130- std::string returnType;
131- std::optional<std::string > objectType;
132- std::string fieldName;
130+ std::string_view returnType;
131+ std::optional<std::string_view > objectType;
132+ std::string_view fieldName;
133133 ValidateFieldArguments arguments;
134134};
135135
136- using ValidateTypeKinds = std::map<std::string , introspection::TypeKind>;
136+ using ValidateTypeKinds = std::map<std::string_view , introspection::TypeKind>;
137137
138138// ValidateVariableTypeVisitor visits the AST and builds a ValidateType structure representing
139139// a variable type in an operation definition as if it came from an Introspection query.
140140class ValidateVariableTypeVisitor
141141{
142142public:
143- ValidateVariableTypeVisitor (const ValidateTypeKinds& typeKinds);
143+ ValidateVariableTypeVisitor (const schema::Schema& schema, const ValidateTypeKinds& typeKinds);
144144
145145 void visit (const peg::ast_node& typeName);
146146
@@ -152,6 +152,7 @@ class ValidateVariableTypeVisitor
152152 void visitListType (const peg::ast_node& listType);
153153 void visitNonNullType (const peg::ast_node& nonNullType);
154154
155+ const schema::Schema& _schema;
155156 const ValidateTypeKinds& _typeKinds;
156157
157158 bool _isInputType = false ;
@@ -163,37 +164,35 @@ class ValidateVariableTypeVisitor
163164class ValidateExecutableVisitor
164165{
165166public:
166- ValidateExecutableVisitor (const Request& service );
167+ ValidateExecutableVisitor (const std::shared_ptr<schema::Schema>& schema );
167168
168169 void visit (const peg::ast_node& root);
169170
170171 std::vector<schema_error> getStructuredErrors ();
171172
172173private:
173- response::Value executeQuery ( std::string_view query) const ;
174+ static ValidateTypeFieldArguments getArguments ( const std::vector<std::shared_ptr<schema::InputValue>>& args) ;
174175
175- static ValidateTypeFieldArguments getArguments (response::ListType&& argumentsMember);
176-
177- using FieldTypes = std::map<std::string, ValidateTypeField>;
178- using TypeFields = std::map<std::string, FieldTypes>;
176+ using FieldTypes = std::map<std::string_view, ValidateTypeField>;
177+ using TypeFields = std::map<std::string_view, FieldTypes>;
179178 using InputFieldTypes = ValidateTypeFieldArguments;
180- using InputTypeFields = std::map<std::string , InputFieldTypes>;
181- using EnumValues = std::map<std::string , std::set<std::string >>;
179+ using InputTypeFields = std::map<std::string_view , InputFieldTypes>;
180+ using EnumValues = std::map<std::string_view , std::set<std::string_view >>;
182181
183- std::optional<introspection::TypeKind> getTypeKind (const std::string& name) const ;
182+ std::optional<introspection::TypeKind> getTypeKind (std::string_view name) const ;
184183 std::optional<introspection::TypeKind> getScopedTypeKind () const ;
185184 constexpr bool isScalarType (introspection::TypeKind kind);
186185
187- bool matchesScopedType (const std::string& name) const ;
186+ bool matchesScopedType (std::string_view name) const ;
188187
189188 TypeFields::const_iterator getScopedTypeFields ();
190- InputTypeFields::const_iterator getInputTypeFields (const std::string& name);
189+ InputTypeFields::const_iterator getInputTypeFields (std::string_view name);
191190 static const ValidateType& getValidateFieldType (const FieldTypes::mapped_type& value);
192191 static const ValidateType& getValidateFieldType (const InputFieldTypes::mapped_type& value);
193192 template <class _FieldTypes >
194- static std::string getFieldType (const _FieldTypes& fields, const std::string& name);
193+ static std::string_view getFieldType (const _FieldTypes& fields, std::string_view name);
195194 template <class _FieldTypes >
196- static std::string getWrappedFieldType (const _FieldTypes& fields, const std::string& name);
195+ static std::string getWrappedFieldType (const _FieldTypes& fields, std::string_view name);
197196 static std::string getWrappedFieldType (const ValidateType& returnType);
198197
199198 void visitFragmentDefinition (const peg::ast_node& fragmentDefinition);
@@ -213,19 +212,19 @@ class ValidateExecutableVisitor
213212 bool validateVariableType (bool isNonNull, const ValidateType& variableType,
214213 const schema_location& position, const ValidateType& inputType);
215214
216- const Request& _service ;
215+ const std::shared_ptr<schema::Schema> _schema ;
217216 std::vector<schema_error> _errors;
218217
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>;
218+ using OperationTypes = std::map<std::string_view, std::string_view >;
219+ using Directives = std::map<std::string_view , ValidateDirective>;
220+ using ExecutableNodes = std::map<std::string_view , const peg::ast_node&>;
221+ using FragmentSet = std::unordered_set<std::string_view >;
222+ using MatchingTypes = std::map<std::string_view , std::set<std::string_view >>;
223+ using ScalarTypes = std::set<std::string_view >;
224+ using VariableDefinitions = std::map<std::string_view , const peg::ast_node&>;
225+ using VariableTypes = std::map<std::string_view , ValidateArgument>;
227226 using OperationVariables = std::optional<VariableTypes>;
228- using VariableSet = std::set<std::string >;
227+ using VariableSet = std::set<std::string_view >;
229228
230229 // These members store Introspection schema information which does not change between queries.
231230 OperationTypes _operationTypes;
@@ -250,8 +249,8 @@ class ValidateExecutableVisitor
250249 size_t _fieldCount = 0 ;
251250 TypeFields _typeFields;
252251 InputTypeFields _inputTypeFields;
253- std::string _scopedType;
254- std::map<std::string , ValidateField> _selectionFields;
252+ std::string_view _scopedType;
253+ std::map<std::string_view , ValidateField> _selectionFields;
255254};
256255
257256} /* namespace graphql::service */
0 commit comments