in src/SchemaLoader.cpp [1627:1715]
std::string SchemaLoader::getOutputCppType(const OutputField& field) const noexcept
{
bool nonNull = true;
size_t templateCount = 0;
std::ostringstream outputType;
switch (field.fieldType)
{
case OutputFieldType::Object:
case OutputFieldType::Union:
case OutputFieldType::Interface:
// Even if it's non-nullable, we still want to return a shared_ptr for complex types
outputType << R"cpp(service::AwaitableObject<)cpp";
++templateCount;
break;
default:
outputType << R"cpp(service::AwaitableScalar<)cpp";
++templateCount;
break;
}
for (auto modifier : field.modifiers)
{
if (!nonNull)
{
outputType << R"cpp(std::optional<)cpp";
++templateCount;
}
switch (modifier)
{
case service::TypeModifier::None:
nonNull = true;
break;
case service::TypeModifier::Nullable:
nonNull = false;
break;
case service::TypeModifier::List:
nonNull = true;
outputType << R"cpp(std::vector<)cpp";
++templateCount;
break;
}
}
switch (field.fieldType)
{
case OutputFieldType::Object:
case OutputFieldType::Union:
case OutputFieldType::Interface:
// Even if it's non-nullable, we still want to return a shared_ptr for complex types
outputType << R"cpp(std::shared_ptr<)cpp";
++templateCount;
break;
default:
if (!nonNull)
{
outputType << R"cpp(std::optional<)cpp";
++templateCount;
}
break;
}
switch (field.fieldType)
{
case OutputFieldType::Builtin:
case OutputFieldType::Scalar:
case OutputFieldType::Enum:
outputType << getCppType(field.type);
break;
case OutputFieldType::Interface:
case OutputFieldType::Union:
case OutputFieldType::Object:
outputType << getSafeCppName(field.type);
break;
}
for (size_t i = 0; i < templateCount; ++i)
{
outputType << R"cpp(>)cpp";
}
return outputType.str();
}