in src/SchemaLoader.cpp [1383:1442]
InputFieldList SchemaLoader::getInputFields(const peg::ast_node::children_t& fields)
{
InputFieldList inputFields;
for (const auto& fieldDefinition : fields)
{
InputField field;
TypeVisitor fieldType;
service::schema_location defaultValueLocation;
for (const auto& child : fieldDefinition->children)
{
if (child->is_type<peg::argument_name>())
{
field.name = child->string_view();
field.cppName = getSafeCppName(field.name);
}
else if (child->is_type<peg::named_type>() || child->is_type<peg::list_type>()
|| child->is_type<peg::nonnull_type>())
{
fieldType.visit(*child);
}
else if (child->is_type<peg::default_value>())
{
const auto position = child->begin();
DefaultValueVisitor defaultValue;
defaultValue.visit(*child->children.back());
field.defaultValue = defaultValue.getValue();
field.defaultValueString = child->children.back()->string_view();
defaultValueLocation = { position.line, position.column };
}
else if (child->is_type<peg::description>() && !child->children.empty())
{
field.description = child->children.front()->unescaped_view();
}
}
std::tie(field.type, field.modifiers) = fieldType.getType();
field.position = fieldDefinition->begin();
if (!field.defaultValueString.empty() && field.defaultValue.type() == response::Type::Null
&& (field.modifiers.empty()
|| field.modifiers.front() != service::TypeModifier::Nullable))
{
std::ostringstream error;
error << "Expected Non-Null default value for field name: " << field.name
<< " line: " << defaultValueLocation.line
<< " column: " << defaultValueLocation.column;
throw std::runtime_error(error.str());
}
inputFields.push_back(std::move(field));
}
return inputFields;
}