@@ -421,7 +421,7 @@ void SchemaLoader::validateImplementedInterfaces() const
421
421
422
422
for (auto interfaceName : interfaceType.interfaces )
423
423
{
424
- validateInterfaceFields (interfaceType.type , interfaceType.fields , interfaceName );
424
+ validateInterfaceFields (interfaceType.type , interfaceName, interfaceType.fields );
425
425
}
426
426
}
427
427
@@ -431,7 +431,7 @@ void SchemaLoader::validateImplementedInterfaces() const
431
431
432
432
for (auto interfaceName : objectType.interfaces )
433
433
{
434
- validateInterfaceFields (objectType.type , objectType.fields , interfaceName );
434
+ validateInterfaceFields (objectType.type , interfaceName, objectType.fields );
435
435
}
436
436
}
437
437
}
@@ -1151,8 +1151,8 @@ void SchemaLoader::blockReservedName(
1151
1151
}
1152
1152
}
1153
1153
1154
- void SchemaLoader::validateInterfaceFields (std::string_view typeName,
1155
- const OutputFieldList& typeFields , std::string_view interfaceName) const
1154
+ const InterfaceType& SchemaLoader::findInterfaceType (
1155
+ std::string_view typeName , std::string_view interfaceName) const
1156
1156
{
1157
1157
const auto itrType = _interfaceNames.find (interfaceName);
1158
1158
@@ -1172,7 +1172,13 @@ void SchemaLoader::validateInterfaceFields(std::string_view typeName,
1172
1172
throw std::runtime_error (error.str ());
1173
1173
}
1174
1174
1175
- const auto & interfaceType = _interfaceTypes[itrType->second ];
1175
+ return _interfaceTypes[itrType->second ];
1176
+ }
1177
+
1178
+ void SchemaLoader::validateInterfaceFields (std::string_view typeName,
1179
+ std::string_view interfaceName, const OutputFieldList& typeFields) const
1180
+ {
1181
+ const auto & interfaceType = findInterfaceType (typeName, interfaceName);
1176
1182
std::set<std::string_view> unimplemented;
1177
1183
1178
1184
for (const auto & entry : interfaceType.fields )
@@ -1215,61 +1221,30 @@ void SchemaLoader::validateTransitiveInterfaces(
1215
1221
1216
1222
for (auto entry : interfaces)
1217
1223
{
1218
- const auto itrType = _interfaceNames.find (entry);
1219
-
1220
- if (itrType == _interfaceNames.cend ())
1221
- {
1222
- std::ostringstream error;
1223
- const auto itrPosition = _typePositions.find (typeName);
1224
-
1225
- error << " Unknown interface: " << entry << " implemented by: " << typeName;
1226
-
1227
- if (itrPosition != _typePositions.cend ())
1228
- {
1229
- error << " line: " << itrPosition->second .line
1230
- << " column: " << itrPosition->second .column ;
1231
- }
1224
+ const auto & interfaceType = findInterfaceType (typeName, entry);
1232
1225
1233
- throw std::runtime_error (error.str ());
1234
- }
1235
-
1236
- if (typeName == entry || !unimplemented.insert (entry).second )
1237
- {
1238
- std::ostringstream error;
1239
- const auto itrPosition = _typePositions.find (typeName);
1240
-
1241
- error << " Interface cycle interface: " << entry << " implemented by: " << typeName;
1242
-
1243
- if (itrPosition != _typePositions.cend ())
1244
- {
1245
- error << " line: " << itrPosition->second .line
1246
- << " column: " << itrPosition->second .column ;
1247
- }
1248
-
1249
- throw std::runtime_error (error.str ());
1250
- }
1251
-
1252
- const auto & interfaceType = _interfaceTypes[itrType->second ];
1226
+ unimplemented.insert (entry);
1253
1227
1254
1228
for (auto interfaceName : interfaceType.interfaces )
1255
1229
{
1256
- if (!unimplemented.insert (interfaceName).second )
1257
- {
1258
- std::ostringstream error;
1259
- const auto itrPosition = _typePositions.find (typeName);
1230
+ unimplemented.insert (interfaceName);
1231
+ }
1232
+ }
1260
1233
1261
- error << " Interface cycle interface: " << interfaceName
1262
- << " implemented by: " << typeName;
1234
+ if (unimplemented.find (typeName) != unimplemented.cend ())
1235
+ {
1236
+ std::ostringstream error;
1237
+ const auto itrPosition = _typePositions.find (typeName);
1263
1238
1264
- if (itrPosition != _typePositions.cend ())
1265
- {
1266
- error << " line: " << itrPosition->second .line
1267
- << " column: " << itrPosition->second .column ;
1268
- }
1239
+ error << " Interface cycle interface: " << typeName;
1269
1240
1270
- throw std::runtime_error (error.str ());
1271
- }
1241
+ if (itrPosition != _typePositions.cend ())
1242
+ {
1243
+ error << " line: " << itrPosition->second .line
1244
+ << " column: " << itrPosition->second .column ;
1272
1245
}
1246
+
1247
+ throw std::runtime_error (error.str ());
1273
1248
}
1274
1249
1275
1250
for (auto entry : interfaces)
0 commit comments