@@ -186,6 +186,11 @@ ObjectType::ObjectType(response::StringType&& name, response::StringType&& descr
186
186
void ObjectType::AddInterfaces (std::vector<std::shared_ptr<InterfaceType>> interfaces)
187
187
{
188
188
_interfaces = std::move (interfaces);
189
+
190
+ for (const auto & interface : _interfaces)
191
+ {
192
+ interface->AddPossibleType (std::static_pointer_cast<ObjectType>(shared_from_this ()));
193
+ }
189
194
}
190
195
191
196
void ObjectType::AddFields (std::vector<std::shared_ptr<Field>> fields)
@@ -234,6 +239,11 @@ InterfaceType::InterfaceType(response::StringType&& name, response::StringType&&
234
239
{
235
240
}
236
241
242
+ void InterfaceType::AddPossibleType (std::weak_ptr<ObjectType> possibleType)
243
+ {
244
+ _possibleTypes.push_back (possibleType);
245
+ }
246
+
237
247
void InterfaceType::AddFields (std::vector<std::shared_ptr<Field>> fields)
238
248
{
239
249
_fields = std::move (fields);
@@ -265,6 +275,19 @@ service::FieldResult<std::optional<std::vector<std::shared_ptr<object::Field>>>>
265
275
return { std::move (result) };
266
276
}
267
277
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
+
268
291
UnionType::UnionType (response::StringType&& name, response::StringType&& description)
269
292
: BaseType(std::move(description))
270
293
, _name(std::move(name))
0 commit comments