Skip to content

Commit 3dd30f0

Browse files
committed
Not passing tests yet, but refactor is done
1 parent 8eaf8c2 commit 3dd30f0

File tree

5 files changed

+308
-783
lines changed

5 files changed

+308
-783
lines changed

include/Validation.h

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
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

1212
namespace graphql::service {
1313

14-
using ValidateType = response::Value;
14+
using ValidateType = std::shared_ptr<schema::BaseType>;
1515

1616
struct 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

2525
struct 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

3333
struct 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

4646
struct ValidateArgumentEnumValue
4747
{
4848
bool operator==(const ValidateArgumentEnumValue& other) const;
4949

50-
std::string value;
50+
std::string_view value;
5151
};
5252

5353
struct 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

7777
using 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

123123
struct 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.
140140
class ValidateVariableTypeVisitor
141141
{
142142
public:
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
163164
class ValidateExecutableVisitor
164165
{
165166
public:
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

172173
private:
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 */

include/graphqlservice/GraphQLService.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,7 @@ class Request : public std::enable_shared_from_this<Request>
10351035
const std::shared_ptr<RequestState>& state, const peg::ast_node& root,
10361036
const std::string& operationName, response::Value&& variables) const;
10371037

1038-
TypeMap _operations;
1038+
const TypeMap _operations;
10391039
std::unique_ptr<ValidateExecutableVisitor> _validation;
10401040
std::map<SubscriptionKey, std::shared_ptr<SubscriptionData>> _subscriptions;
10411041
std::unordered_map<SubscriptionName, std::set<SubscriptionKey>> _listeners;

src/GraphQLService.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1759,7 +1759,7 @@ void SubscriptionDefinitionVisitor::visitInlineFragment(const peg::ast_node& inl
17591759

17601760
Request::Request(TypeMap&& operationTypes, const std::shared_ptr<schema::Schema>& schema)
17611761
: _operations(std::move(operationTypes))
1762-
, _validation(std::make_unique<ValidateExecutableVisitor>(*this))
1762+
, _validation(std::make_unique<ValidateExecutableVisitor>(schema))
17631763
{
17641764
}
17651765

0 commit comments

Comments
 (0)