in src/ClientGenerator.cpp [862:1034]
int main(int argc, char** argv)
{
po::options_description options("Command line options");
po::positional_options_description positional;
po::variables_map variables;
bool showUsage = false;
bool showVersion = false;
bool buildCustom = false;
bool verbose = false;
bool noIntrospection = false;
std::string schemaFileName;
std::string requestFileName;
std::string operationName;
std::string filenamePrefix;
std::string schemaNamespace;
std::string sourceDir;
std::string headerDir;
options.add_options()("version", po::bool_switch(&showVersion), "Print the version number")(
"help,?",
po::bool_switch(&showUsage),
"Print the command line options")("verbose,v",
po::bool_switch(&verbose),
"Verbose output including generated header names as well as sources")("schema,s",
po::value(&schemaFileName),
"Schema definition file path")("request,r",
po::value(&requestFileName),
"Request document file path")("operation,o",
po::value(&operationName),
"Operation name if the request document contains more than one")("prefix,p",
po::value(&filenamePrefix),
"Prefix to use for the generated C++ filenames")("namespace,n",
po::value(&schemaNamespace),
"C++ sub-namespace for the generated types")("source-dir",
po::value(&sourceDir),
"Target path for the <prefix>Client.cpp source file")("header-dir",
po::value(&headerDir),
"Target path for the <prefix>Client.h header file")("no-introspection",
po::bool_switch(&noIntrospection),
"Do not expect support for Introspection");
positional.add("schema", 1).add("request", 1).add("prefix", 1).add("namespace", 1);
try
{
po::store(po::command_line_parser(argc, argv).options(options).positional(positional).run(),
variables);
po::notify(variables);
// If you specify any of these parameters, you must specify all three.
buildCustom = !schemaFileName.empty() || !requestFileName.empty() || !filenamePrefix.empty()
|| !schemaNamespace.empty();
if (buildCustom)
{
if (schemaFileName.empty())
{
throw po::required_option("schema");
}
else if (requestFileName.empty())
{
throw po::required_option("request");
}
else if (filenamePrefix.empty())
{
throw po::required_option("prefix");
}
else if (schemaNamespace.empty())
{
throw po::required_option("namespace");
}
}
}
catch (const po::error& oe)
{
std::cerr << "Command line errror: " << oe.what() << std::endl;
outputUsage(std::cerr, options);
return 1;
}
if (showVersion)
{
outputVersion(std::cout);
return 0;
}
else if (showUsage || !buildCustom)
{
outputUsage(std::cout, options);
return 0;
}
try
{
const auto files = graphql::generator::client::Generator(
graphql::generator::SchemaOptions { std::move(schemaFileName),
std::move(filenamePrefix),
std::move(schemaNamespace) },
graphql::generator::RequestOptions {
std::move(requestFileName),
std::move(operationName),
noIntrospection,
},
graphql::generator::client::GeneratorOptions {
{ std::move(headerDir), std::move(sourceDir) },
verbose,
})
.Build();
for (const auto& file : files)
{
std::cout << file << std::endl;
}
}
catch (const graphql::peg::parse_error& pe)
{
std::cerr << "Invalid GraphQL: " << pe.what() << std::endl;
for (const auto& position : pe.positions())
{
std::cerr << "\tline: " << position.line << " column: " << position.column << std::endl;
}
return 1;
}
catch (graphql::service::schema_exception& scx)
{
auto errors = scx.getStructuredErrors();
std::cerr << "Invalid Request:" << std::endl;
for (const auto& error : errors)
{
std::cerr << "\tmessage: " << error.message << ", line: " << error.location.line
<< ", column: " << error.location.column << std::endl;
if (!error.path.empty())
{
bool addSeparator = false;
std::cerr << "\tpath: ";
for (const auto& segment : error.path)
{
if (std::holds_alternative<size_t>(segment))
{
std::cerr << '[' << std::get<size_t>(segment) << ']';
}
else
{
if (addSeparator)
{
std::cerr << '.';
}
std::cerr << std::get<std::string_view>(segment);
}
addSeparator = true;
}
std::cerr << std::endl;
}
}
return 1;
}
catch (const std::runtime_error& ex)
{
std::cerr << ex.what() << std::endl;
return 1;
}
return 0;
}