in src/SchemaLoader.cpp [235:318]
void SchemaLoader::fixupOutputFieldList(OutputFieldList& fields,
const std::optional<std::unordered_set<std::string_view>>& interfaceFields,
const std::optional<std::string_view>& accessor)
{
for (auto& entry : fields)
{
if (interfaceFields)
{
entry.interfaceField = false;
entry.inheritedField = interfaceFields->find(entry.name) != interfaceFields->cend();
}
else
{
entry.interfaceField = true;
entry.inheritedField = false;
}
if (accessor)
{
entry.accessor = *accessor;
}
if (s_builtinTypes.find(entry.type) != s_builtinTypes.cend())
{
continue;
}
auto itr = _schemaTypes.find(entry.type);
if (itr == _schemaTypes.cend())
{
std::ostringstream error;
error << "Unknown field type: " << entry.type;
if (entry.position)
{
error << " line: " << entry.position->line << " column: " << entry.position->column;
}
throw std::runtime_error(error.str());
}
switch (itr->second)
{
case SchemaType::Scalar:
entry.fieldType = OutputFieldType::Scalar;
break;
case SchemaType::Enum:
entry.fieldType = OutputFieldType::Enum;
break;
case SchemaType::Union:
entry.fieldType = OutputFieldType::Union;
break;
case SchemaType::Interface:
entry.fieldType = OutputFieldType::Interface;
break;
case SchemaType::Object:
entry.fieldType = OutputFieldType::Object;
break;
default:
{
std::ostringstream error;
error << "Invalid field type: " << entry.type;
if (entry.position)
{
error << " line: " << entry.position->line
<< " column: " << entry.position->column;
}
throw std::runtime_error(error.str());
}
}
fixupInputFieldList(entry.arguments);
}
}