1111
1212namespace graphql ::service {
1313
14- using ValidateType = std::shared_ptr<schema::BaseType>;
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{
@@ -122,25 +126,26 @@ using ValidateFieldArguments = std::map<std::string_view, ValidateArgumentValueP
122126
123127struct ValidateField
124128{
125- ValidateField (std::string && returnType, std::optional<std:: string_view> objectType ,
126- std::string_view 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_view> objectType;
134+ ValidateType returnType;
135+ ValidateType objectType;
132136 std::string_view fieldName;
133137 ValidateFieldArguments arguments;
134138};
135139
136- using ValidateTypeKinds = std::map<std::string_view, 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 std::shared_ptr<schema::Schema>& schema, 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
@@ -153,7 +158,7 @@ class ValidateVariableTypeVisitor
153158 void visitNonNullType (const peg::ast_node& nonNullType);
154159
155160 const std::shared_ptr<schema::Schema>& _schema;
156- const ValidateTypeKinds& _typeKinds ;
161+ const ValidateTypes& _types ;
157162
158163 bool _isInputType = false ;
159164 ValidateType _variableType;
@@ -171,16 +176,15 @@ class ValidateExecutableVisitor
171176 std::vector<schema_error> getStructuredErrors ();
172177
173178private:
174- static ValidateTypeFieldArguments getArguments (const std::vector<std::shared_ptr<schema::InputValue>>& args);
179+ static ValidateTypeFieldArguments getArguments (
180+ const std::vector<std::shared_ptr<const schema::InputValue>>& args);
175181
176182 using FieldTypes = std::map<std::string_view, ValidateTypeField>;
177183 using TypeFields = std::map<std::string_view, FieldTypes>;
178184 using InputFieldTypes = ValidateTypeFieldArguments;
179185 using InputTypeFields = std::map<std::string_view, InputFieldTypes>;
180186 using EnumValues = std::map<std::string_view, std::set<std::string_view>>;
181187
182- std::optional<introspection::TypeKind> getTypeKind (std::string_view name) const ;
183- std::optional<introspection::TypeKind> getScopedTypeKind () const ;
184188 constexpr bool isScalarType (introspection::TypeKind kind);
185189
186190 bool matchesScopedType (std::string_view name) const ;
@@ -190,10 +194,9 @@ class ValidateExecutableVisitor
190194 static const ValidateType& getValidateFieldType (const FieldTypes::mapped_type& value);
191195 static const ValidateType& getValidateFieldType (const InputFieldTypes::mapped_type& value);
192196 template <class _FieldTypes >
193- static std::string_view getFieldType (const _FieldTypes& fields, std::string_view name);
197+ static ValidateType getFieldType (const _FieldTypes& fields, std::string_view name);
194198 template <class _FieldTypes >
195- static std::string getWrappedFieldType (const _FieldTypes& fields, std::string_view name);
196- static std::string getWrappedFieldType (const ValidateType& returnType);
199+ static ValidateType getWrappedFieldType (const _FieldTypes& fields, std::string_view name);
197200
198201 void visitFragmentDefinition (const peg::ast_node& fragmentDefinition);
199202 void visitOperationDefinition (const peg::ast_node& operationDefinition);
@@ -215,7 +218,6 @@ class ValidateExecutableVisitor
215218 const std::shared_ptr<schema::Schema> _schema;
216219 std::vector<schema_error> _errors;
217220
218- using OperationTypes = std::map<std::string_view, std::string_view>;
219221 using Directives = std::map<std::string_view, ValidateDirective>;
220222 using ExecutableNodes = std::map<std::string_view, const peg::ast_node&>;
221223 using FragmentSet = std::unordered_set<std::string_view>;
@@ -227,8 +229,8 @@ class ValidateExecutableVisitor
227229 using VariableSet = std::set<std::string_view>;
228230
229231 // These members store Introspection schema information which does not change between queries.
230- OperationTypes _operationTypes;
231- ValidateTypeKinds _typeKinds ;
232+ ValidateTypes _operationTypes;
233+ ValidateTypes _types ;
232234 MatchingTypes _matchingTypes;
233235 Directives _directives;
234236 EnumValues _enumValues;
@@ -249,7 +251,7 @@ class ValidateExecutableVisitor
249251 size_t _fieldCount = 0 ;
250252 TypeFields _typeFields;
251253 InputTypeFields _inputTypeFields;
252- std::string_view _scopedType;
254+ ValidateType _scopedType;
253255 std::map<std::string_view, ValidateField> _selectionFields;
254256};
255257
0 commit comments