Skip to content

Commit 27d0bcb

Browse files
committed
Add possibleTypes to interfaces in Introspection
1 parent 0bc5c6c commit 27d0bcb

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

include/graphqlservice/Introspection.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,17 +113,20 @@ class InterfaceType : public BaseType
113113
public:
114114
explicit InterfaceType(response::StringType&& name, response::StringType&& description);
115115

116+
void AddPossibleType(std::weak_ptr<ObjectType> possibleType);
116117
void AddFields(std::vector<std::shared_ptr<Field>> fields);
117118

118119
// Accessors
119120
service::FieldResult<TypeKind> getKind(service::FieldParams&& params) const override;
120121
service::FieldResult<std::optional<response::StringType>> getName(service::FieldParams&& params) const override;
121122
service::FieldResult<std::optional<std::vector<std::shared_ptr<object::Field>>>> getFields(service::FieldParams&& params, std::optional<response::BooleanType>&& includeDeprecatedArg) const override;
123+
service::FieldResult<std::optional<std::vector<std::shared_ptr<object::Type>>>> getPossibleTypes(service::FieldParams&& params) const override;
122124

123125
private:
124126
const response::StringType _name;
125127

126128
std::vector<std::shared_ptr<Field>> _fields;
129+
std::vector<std::weak_ptr<ObjectType>> _possibleTypes;
127130
};
128131

129132
class UnionType : public BaseType

src/Introspection.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,11 @@ ObjectType::ObjectType(response::StringType&& name, response::StringType&& descr
186186
void ObjectType::AddInterfaces(std::vector<std::shared_ptr<InterfaceType>> interfaces)
187187
{
188188
_interfaces = std::move(interfaces);
189+
190+
for (const auto& interface : _interfaces)
191+
{
192+
interface->AddPossibleType(std::static_pointer_cast<ObjectType>(shared_from_this()));
193+
}
189194
}
190195

191196
void ObjectType::AddFields(std::vector<std::shared_ptr<Field>> fields)
@@ -234,6 +239,11 @@ InterfaceType::InterfaceType(response::StringType&& name, response::StringType&&
234239
{
235240
}
236241

242+
void InterfaceType::AddPossibleType(std::weak_ptr<ObjectType> possibleType)
243+
{
244+
_possibleTypes.push_back(possibleType);
245+
}
246+
237247
void InterfaceType::AddFields(std::vector<std::shared_ptr<Field>> fields)
238248
{
239249
_fields = std::move(fields);
@@ -265,6 +275,19 @@ service::FieldResult<std::optional<std::vector<std::shared_ptr<object::Field>>>>
265275
return { std::move(result) };
266276
}
267277

278+
service::FieldResult<std::optional<std::vector<std::shared_ptr<object::Type>>>> InterfaceType::getPossibleTypes(service::FieldParams&&) const
279+
{
280+
auto result = std::make_optional<std::vector<std::shared_ptr<object::Type>>>(_possibleTypes.size());
281+
282+
std::transform(_possibleTypes.cbegin(), _possibleTypes.cend(), result->begin(),
283+
[](const std::weak_ptr<object::Type>& weak)
284+
{
285+
return weak.lock();
286+
});
287+
288+
return { std::move(result) };
289+
}
290+
268291
UnionType::UnionType(response::StringType&& name, response::StringType&& description)
269292
: BaseType(std::move(description))
270293
, _name(std::move(name))

0 commit comments

Comments
 (0)