Skip to content

Commit 7807c53

Browse files
committed
Implement type-erased interface object types
1 parent 2a58702 commit 7807c53

File tree

114 files changed

+5766
-3457
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

114 files changed

+5766
-3457
lines changed

include/SchemaGenerator.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,26 @@ class Generator
4242
std::string getSourcePath() const noexcept;
4343

4444
bool outputHeader() const noexcept;
45-
void outputObjectStubs(
46-
std::ostream& headerFile, const ObjectType& objectType) const;
45+
void outputInterfaceDeclaration(
46+
std::ostream& headerFile, const InterfaceType& interfaceType) const;
47+
void outputObjectImplements(std::ostream& headerFile, const ObjectType& objectType) const;
48+
void outputObjectStubs(std::ostream& headerFile, const ObjectType& objectType) const;
4749
void outputObjectDeclaration(
4850
std::ostream& headerFile, const ObjectType& objectType, bool isQueryType) const;
4951
std::string getFieldDeclaration(const InputField& inputField) const noexcept;
5052
std::string getFieldDeclaration(const OutputField& outputField) const noexcept;
5153
std::string getResolverDeclaration(const OutputField& outputField) const noexcept;
5254

5355
bool outputSource() const noexcept;
56+
void outputInterfaceImplementation(
57+
std::ostream& sourceFile, const InterfaceType& interfaceType) const;
58+
void outputInterfaceIntrospection(
59+
std::ostream& sourceFile, const InterfaceType& interfaceType) const;
5460
void outputObjectImplementation(
5561
std::ostream& sourceFile, const ObjectType& objectType, bool isQueryType) const;
5662
void outputObjectIntrospection(std::ostream& sourceFile, const ObjectType& objectType) const;
63+
void outputIntrospectionFields(
64+
std::ostream& sourceFile, std::string_view cppType, const OutputFieldList& fields) const;
5765
std::string getArgumentDefaultValue(
5866
size_t level, const response::Value& defaultValue) const noexcept;
5967
std::string getArgumentDeclaration(const InputField& argument, const char* prefixToken,

include/graphqlservice/GraphQLService.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ using TypeNames = internal::string_view_set;
612612
class Object : public std::enable_shared_from_this<Object>
613613
{
614614
public:
615-
GRAPHQLSERVICE_EXPORT explicit Object(TypeNames&& typeNames, ResolverMap&& resolvers);
615+
GRAPHQLSERVICE_EXPORT explicit Object(TypeNames&& typeNames, ResolverMap&& resolvers) noexcept;
616616
GRAPHQLSERVICE_EXPORT virtual ~Object() = default;
617617

618618
GRAPHQLSERVICE_EXPORT AwaitableResolver resolve(const SelectionSetParams& selectionSetParams,
@@ -631,7 +631,7 @@ class Object : public std::enable_shared_from_this<Object>
631631
GRAPHQLSERVICE_EXPORT virtual void beginSelectionSet(const SelectionSetParams& params) const;
632632
GRAPHQLSERVICE_EXPORT virtual void endSelectionSet(const SelectionSetParams& params) const;
633633

634-
std::mutex _resolverMutex {};
634+
mutable std::mutex _resolverMutex {};
635635

636636
private:
637637
TypeNames _typeNames;

include/graphqlservice/introspection/IntrospectionSchema.h

Lines changed: 63 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,13 @@ class Schema
8787
: public service::Object
8888
{
8989
private:
90-
service::AwaitableResolver resolveTypes(service::ResolverParams&& params);
91-
service::AwaitableResolver resolveQueryType(service::ResolverParams&& params);
92-
service::AwaitableResolver resolveMutationType(service::ResolverParams&& params);
93-
service::AwaitableResolver resolveSubscriptionType(service::ResolverParams&& params);
94-
service::AwaitableResolver resolveDirectives(service::ResolverParams&& params);
90+
service::AwaitableResolver resolveTypes(service::ResolverParams&& params) const;
91+
service::AwaitableResolver resolveQueryType(service::ResolverParams&& params) const;
92+
service::AwaitableResolver resolveMutationType(service::ResolverParams&& params) const;
93+
service::AwaitableResolver resolveSubscriptionType(service::ResolverParams&& params) const;
94+
service::AwaitableResolver resolveDirectives(service::ResolverParams&& params) const;
9595

96-
service::AwaitableResolver resolve_typename(service::ResolverParams&& params);
96+
service::AwaitableResolver resolve_typename(service::ResolverParams&& params) const;
9797

9898
struct Concept
9999
{
@@ -146,26 +146,29 @@ class Schema
146146

147147
const std::unique_ptr<Concept> _pimpl;
148148

149+
service::TypeNames getTypeNames() const noexcept;
150+
service::ResolverMap getResolvers() const noexcept;
151+
149152
public:
150-
GRAPHQLINTROSPECTION_EXPORT Schema(std::shared_ptr<introspection::Schema> pimpl);
153+
GRAPHQLINTROSPECTION_EXPORT Schema(std::shared_ptr<introspection::Schema> pimpl) noexcept;
151154
GRAPHQLINTROSPECTION_EXPORT ~Schema();
152155
};
153156

154157
class Type
155158
: public service::Object
156159
{
157160
private:
158-
service::AwaitableResolver resolveKind(service::ResolverParams&& params);
159-
service::AwaitableResolver resolveName(service::ResolverParams&& params);
160-
service::AwaitableResolver resolveDescription(service::ResolverParams&& params);
161-
service::AwaitableResolver resolveFields(service::ResolverParams&& params);
162-
service::AwaitableResolver resolveInterfaces(service::ResolverParams&& params);
163-
service::AwaitableResolver resolvePossibleTypes(service::ResolverParams&& params);
164-
service::AwaitableResolver resolveEnumValues(service::ResolverParams&& params);
165-
service::AwaitableResolver resolveInputFields(service::ResolverParams&& params);
166-
service::AwaitableResolver resolveOfType(service::ResolverParams&& params);
167-
168-
service::AwaitableResolver resolve_typename(service::ResolverParams&& params);
161+
service::AwaitableResolver resolveKind(service::ResolverParams&& params) const;
162+
service::AwaitableResolver resolveName(service::ResolverParams&& params) const;
163+
service::AwaitableResolver resolveDescription(service::ResolverParams&& params) const;
164+
service::AwaitableResolver resolveFields(service::ResolverParams&& params) const;
165+
service::AwaitableResolver resolveInterfaces(service::ResolverParams&& params) const;
166+
service::AwaitableResolver resolvePossibleTypes(service::ResolverParams&& params) const;
167+
service::AwaitableResolver resolveEnumValues(service::ResolverParams&& params) const;
168+
service::AwaitableResolver resolveInputFields(service::ResolverParams&& params) const;
169+
service::AwaitableResolver resolveOfType(service::ResolverParams&& params) const;
170+
171+
service::AwaitableResolver resolve_typename(service::ResolverParams&& params) const;
169172

170173
struct Concept
171174
{
@@ -242,23 +245,26 @@ class Type
242245

243246
const std::unique_ptr<Concept> _pimpl;
244247

248+
service::TypeNames getTypeNames() const noexcept;
249+
service::ResolverMap getResolvers() const noexcept;
250+
245251
public:
246-
GRAPHQLINTROSPECTION_EXPORT Type(std::shared_ptr<introspection::Type> pimpl);
252+
GRAPHQLINTROSPECTION_EXPORT Type(std::shared_ptr<introspection::Type> pimpl) noexcept;
247253
GRAPHQLINTROSPECTION_EXPORT ~Type();
248254
};
249255

250256
class Field
251257
: public service::Object
252258
{
253259
private:
254-
service::AwaitableResolver resolveName(service::ResolverParams&& params);
255-
service::AwaitableResolver resolveDescription(service::ResolverParams&& params);
256-
service::AwaitableResolver resolveArgs(service::ResolverParams&& params);
257-
service::AwaitableResolver resolveType(service::ResolverParams&& params);
258-
service::AwaitableResolver resolveIsDeprecated(service::ResolverParams&& params);
259-
service::AwaitableResolver resolveDeprecationReason(service::ResolverParams&& params);
260+
service::AwaitableResolver resolveName(service::ResolverParams&& params) const;
261+
service::AwaitableResolver resolveDescription(service::ResolverParams&& params) const;
262+
service::AwaitableResolver resolveArgs(service::ResolverParams&& params) const;
263+
service::AwaitableResolver resolveType(service::ResolverParams&& params) const;
264+
service::AwaitableResolver resolveIsDeprecated(service::ResolverParams&& params) const;
265+
service::AwaitableResolver resolveDeprecationReason(service::ResolverParams&& params) const;
260266

261-
service::AwaitableResolver resolve_typename(service::ResolverParams&& params);
267+
service::AwaitableResolver resolve_typename(service::ResolverParams&& params) const;
262268

263269
struct Concept
264270
{
@@ -317,21 +323,24 @@ class Field
317323

318324
const std::unique_ptr<Concept> _pimpl;
319325

326+
service::TypeNames getTypeNames() const noexcept;
327+
service::ResolverMap getResolvers() const noexcept;
328+
320329
public:
321-
GRAPHQLINTROSPECTION_EXPORT Field(std::shared_ptr<introspection::Field> pimpl);
330+
GRAPHQLINTROSPECTION_EXPORT Field(std::shared_ptr<introspection::Field> pimpl) noexcept;
322331
GRAPHQLINTROSPECTION_EXPORT ~Field();
323332
};
324333

325334
class InputValue
326335
: public service::Object
327336
{
328337
private:
329-
service::AwaitableResolver resolveName(service::ResolverParams&& params);
330-
service::AwaitableResolver resolveDescription(service::ResolverParams&& params);
331-
service::AwaitableResolver resolveType(service::ResolverParams&& params);
332-
service::AwaitableResolver resolveDefaultValue(service::ResolverParams&& params);
338+
service::AwaitableResolver resolveName(service::ResolverParams&& params) const;
339+
service::AwaitableResolver resolveDescription(service::ResolverParams&& params) const;
340+
service::AwaitableResolver resolveType(service::ResolverParams&& params) const;
341+
service::AwaitableResolver resolveDefaultValue(service::ResolverParams&& params) const;
333342

334-
service::AwaitableResolver resolve_typename(service::ResolverParams&& params);
343+
service::AwaitableResolver resolve_typename(service::ResolverParams&& params) const;
335344

336345
struct Concept
337346
{
@@ -378,21 +387,24 @@ class InputValue
378387

379388
const std::unique_ptr<Concept> _pimpl;
380389

390+
service::TypeNames getTypeNames() const noexcept;
391+
service::ResolverMap getResolvers() const noexcept;
392+
381393
public:
382-
GRAPHQLINTROSPECTION_EXPORT InputValue(std::shared_ptr<introspection::InputValue> pimpl);
394+
GRAPHQLINTROSPECTION_EXPORT InputValue(std::shared_ptr<introspection::InputValue> pimpl) noexcept;
383395
GRAPHQLINTROSPECTION_EXPORT ~InputValue();
384396
};
385397

386398
class EnumValue
387399
: public service::Object
388400
{
389401
private:
390-
service::AwaitableResolver resolveName(service::ResolverParams&& params);
391-
service::AwaitableResolver resolveDescription(service::ResolverParams&& params);
392-
service::AwaitableResolver resolveIsDeprecated(service::ResolverParams&& params);
393-
service::AwaitableResolver resolveDeprecationReason(service::ResolverParams&& params);
402+
service::AwaitableResolver resolveName(service::ResolverParams&& params) const;
403+
service::AwaitableResolver resolveDescription(service::ResolverParams&& params) const;
404+
service::AwaitableResolver resolveIsDeprecated(service::ResolverParams&& params) const;
405+
service::AwaitableResolver resolveDeprecationReason(service::ResolverParams&& params) const;
394406

395-
service::AwaitableResolver resolve_typename(service::ResolverParams&& params);
407+
service::AwaitableResolver resolve_typename(service::ResolverParams&& params) const;
396408

397409
struct Concept
398410
{
@@ -439,21 +451,24 @@ class EnumValue
439451

440452
const std::unique_ptr<Concept> _pimpl;
441453

454+
service::TypeNames getTypeNames() const noexcept;
455+
service::ResolverMap getResolvers() const noexcept;
456+
442457
public:
443-
GRAPHQLINTROSPECTION_EXPORT EnumValue(std::shared_ptr<introspection::EnumValue> pimpl);
458+
GRAPHQLINTROSPECTION_EXPORT EnumValue(std::shared_ptr<introspection::EnumValue> pimpl) noexcept;
444459
GRAPHQLINTROSPECTION_EXPORT ~EnumValue();
445460
};
446461

447462
class Directive
448463
: public service::Object
449464
{
450465
private:
451-
service::AwaitableResolver resolveName(service::ResolverParams&& params);
452-
service::AwaitableResolver resolveDescription(service::ResolverParams&& params);
453-
service::AwaitableResolver resolveLocations(service::ResolverParams&& params);
454-
service::AwaitableResolver resolveArgs(service::ResolverParams&& params);
466+
service::AwaitableResolver resolveName(service::ResolverParams&& params) const;
467+
service::AwaitableResolver resolveDescription(service::ResolverParams&& params) const;
468+
service::AwaitableResolver resolveLocations(service::ResolverParams&& params) const;
469+
service::AwaitableResolver resolveArgs(service::ResolverParams&& params) const;
455470

456-
service::AwaitableResolver resolve_typename(service::ResolverParams&& params);
471+
service::AwaitableResolver resolve_typename(service::ResolverParams&& params) const;
457472

458473
struct Concept
459474
{
@@ -500,8 +515,11 @@ class Directive
500515

501516
const std::unique_ptr<Concept> _pimpl;
502517

518+
service::TypeNames getTypeNames() const noexcept;
519+
service::ResolverMap getResolvers() const noexcept;
520+
503521
public:
504-
GRAPHQLINTROSPECTION_EXPORT Directive(std::shared_ptr<introspection::Directive> pimpl);
522+
GRAPHQLINTROSPECTION_EXPORT Directive(std::shared_ptr<introspection::Directive> pimpl) noexcept;
505523
GRAPHQLINTROSPECTION_EXPORT ~Directive();
506524
};
507525

samples/learn/DroidData.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4+
#include "CharacterObject.h"
5+
46
#include "DroidData.h"
57

68
#include "HumanData.h"
@@ -45,9 +47,9 @@ const std::optional<std::string>& Droid::getName() const noexcept
4547
return name_;
4648
}
4749

48-
std::optional<std::vector<std::shared_ptr<service::Object>>> Droid::getFriends() const noexcept
50+
std::optional<std::vector<std::shared_ptr<object::Character>>> Droid::getFriends() const noexcept
4951
{
50-
std::vector<std::shared_ptr<service::Object>> result(friends_.size());
52+
std::vector<std::shared_ptr<object::Character>> result(friends_.size());
5153

5254
std::transform(friends_.begin(),
5355
friends_.end(),
@@ -59,12 +61,12 @@ std::optional<std::vector<std::shared_ptr<service::Object>>> Droid::getFriends()
5961

6062
if constexpr (std::is_same_v<std::weak_ptr<Human>, hero_t>)
6163
{
62-
return std::static_pointer_cast<service::Object>(
64+
return std::make_shared<object::Character>(
6365
std::make_shared<object::Human>(hero.lock()));
6466
}
6567
else if constexpr (std::is_same_v<std::weak_ptr<Droid>, hero_t>)
6668
{
67-
return std::static_pointer_cast<service::Object>(
69+
return std::make_shared<object::Character>(
6870
std::make_shared<object::Droid>(hero.lock()));
6971
}
7072
},

samples/learn/DroidData.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class Droid
2424

2525
const std::string& getId() const noexcept;
2626
const std::optional<std::string>& getName() const noexcept;
27-
std::optional<std::vector<std::shared_ptr<service::Object>>> getFriends() const noexcept;
27+
std::optional<std::vector<std::shared_ptr<object::Character>>> getFriends() const noexcept;
2828
std::optional<std::vector<std::optional<Episode>>> getAppearsIn() const noexcept;
2929
const std::optional<std::string>& getPrimaryFunction() const noexcept;
3030

samples/learn/HumanData.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4+
#include "CharacterObject.h"
5+
46
#include "HumanData.h"
57

68
#include "DroidData.h"
@@ -44,9 +46,9 @@ const std::optional<std::string>& Human::getName() const noexcept
4446
return name_;
4547
}
4648

47-
std::optional<std::vector<std::shared_ptr<service::Object>>> Human::getFriends() const noexcept
49+
std::optional<std::vector<std::shared_ptr<object::Character>>> Human::getFriends() const noexcept
4850
{
49-
std::vector<std::shared_ptr<service::Object>> result(friends_.size());
51+
std::vector<std::shared_ptr<object::Character>> result(friends_.size());
5052

5153
std::transform(friends_.begin(),
5254
friends_.end(),
@@ -58,12 +60,12 @@ std::optional<std::vector<std::shared_ptr<service::Object>>> Human::getFriends()
5860

5961
if constexpr (std::is_same_v<std::weak_ptr<Human>, hero_t>)
6062
{
61-
return std::static_pointer_cast<service::Object>(
63+
return std::make_shared<object::Character>(
6264
std::make_shared<object::Human>(hero.lock()));
6365
}
6466
else if constexpr (std::is_same_v<std::weak_ptr<Droid>, hero_t>)
6567
{
66-
return std::static_pointer_cast<service::Object>(
68+
return std::make_shared<object::Character>(
6769
std::make_shared<object::Droid>(hero.lock()));
6870
}
6971
},

samples/learn/HumanData.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class Human
2222

2323
const std::string& getId() const noexcept;
2424
const std::optional<std::string>& getName() const noexcept;
25-
std::optional<std::vector<std::shared_ptr<service::Object>>> getFriends() const noexcept;
25+
std::optional<std::vector<std::shared_ptr<object::Character>>> getFriends() const noexcept;
2626
std::optional<std::vector<std::optional<Episode>>> getAppearsIn() const noexcept;
2727
const std::optional<std::string>& getHomePlanet() const noexcept;
2828

samples/learn/QueryData.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4+
#include "CharacterObject.h"
5+
46
#include "QueryData.h"
57

68
namespace graphql::learn {
@@ -14,9 +16,9 @@ Query::Query(std::map<Episode, SharedHero>&& heroes,
1416
{
1517
}
1618

17-
std::shared_ptr<service::Object> Query::getHero(std::optional<Episode> episodeArg) const noexcept
19+
std::shared_ptr<object::Character> Query::getHero(std::optional<Episode> episodeArg) const noexcept
1820
{
19-
std::shared_ptr<service::Object> result;
21+
std::shared_ptr<object::Character> result;
2022
const auto episode = episodeArg ? *episodeArg : Episode::NEW_HOPE;
2123

2224
if (const auto itr = heroes_.find(episode); itr != heroes_.end())
@@ -27,12 +29,12 @@ std::shared_ptr<service::Object> Query::getHero(std::optional<Episode> episodeAr
2729

2830
if constexpr (std::is_same_v<std::shared_ptr<Human>, hero_t>)
2931
{
30-
return std::static_pointer_cast<service::Object>(
32+
return std::make_shared<object::Character>(
3133
std::make_shared<object::Human>(hero));
3234
}
3335
else if constexpr (std::is_same_v<std::shared_ptr<Droid>, hero_t>)
3436
{
35-
return std::static_pointer_cast<service::Object>(
37+
return std::make_shared<object::Character>(
3638
std::make_shared<object::Droid>(hero));
3739
}
3840
},

samples/learn/QueryData.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class Query
2020
std::map<std::string, std::shared_ptr<Human>>&& humans,
2121
std::map<std::string, std::shared_ptr<Droid>>&& droids) noexcept;
2222

23-
std::shared_ptr<service::Object> getHero(std::optional<Episode> episodeArg) const noexcept;
23+
std::shared_ptr<object::Character> getHero(std::optional<Episode> episodeArg) const noexcept;
2424
std::shared_ptr<object::Human> getHuman(const std::string& idArg) const noexcept;
2525
std::shared_ptr<object::Droid> getDroid(const std::string& idArg) const noexcept;
2626

0 commit comments

Comments
 (0)