yalantinglibs/src/struct_pb/protoc-plugin/StructGenerator.cpp

84 lines
2.7 KiB
C++
Raw Normal View History

2023-01-09 16:18:54 +08:00
#include "StructGenerator.h"
#include <iostream>
#include "FileGenerator.h"
#include "Options.hpp"
#include "google/protobuf/descriptor.pb.h"
#include "helpers.hpp"
namespace struct_pb {
namespace compiler {
bool StructGenerator::Generate(
const google::protobuf::FileDescriptor *file, const std::string &parameter,
google::protobuf::compiler::GeneratorContext *generator_context,
std::string *error) const {
std::vector<std::pair<std::string, std::string>> options;
google::protobuf::compiler::ParseGeneratorParameter(parameter, &options);
Options struct_pb_options(file);
for (const auto &option : options) {
const auto &key = option.first;
const auto &value = option.second;
if (key == "struct_name_style") {
if (value == "camel_case") {
struct_pb_options.struct_name_style = Options::name_style::camel_case;
}
else if (value == "snake_case") {
struct_pb_options.struct_name_style = Options::name_style::snake_case;
}
else if (value == "kebab_case") {
struct_pb_options.struct_name_style = Options::name_style::kebab_case;
}
else if (value == "pascal_case") {
struct_pb_options.struct_name_style = Options::name_style::pascal_case;
}
}
else if (key == "generate_eq_op") {
struct_pb_options.generate_eq_op = true;
}
else if (key == "namespace") {
struct_pb_options.ns = value;
}
else {
*error = "Unknown generator option: " + key;
return false;
}
}
if (struct_pb_options.ns.empty()) {
struct_pb_options.ns = file->package();
}
auto basename = strip_proto(file->name());
2023-01-09 16:18:54 +08:00
FileGenerator file_generator(file, struct_pb_options);
// generate xxx.struct_pb.h
{
std::unique_ptr<io::ZeroCopyOutputStream> output(
generator_context->Open(basename + ".struct_pb.h"));
google::protobuf::io::Printer p(output.get(), '$');
p.Print({{"parameter", parameter}}, R"(// protoc generate parameter
// clang-format off
2023-01-09 16:18:54 +08:00
// $parameter$
// =========================
#include "struct_pb/struct_pb.hpp"
)");
file_generator.generate_header(&p);
}
// generate xxx.struct_pb.cc
{
std::unique_ptr<io::ZeroCopyOutputStream> output(
generator_context->Open(basename + ".struct_pb.cc"));
google::protobuf::io::Printer p(output.get(), '$');
p.Print(
{{"parameter", parameter}, {"header_file", basename + ".struct_pb.h"}},
R"(// protoc generate parameter
// clang-format off
2023-01-09 16:18:54 +08:00
// $parameter$
// =========================
#include "$header_file$"
#include "struct_pb/struct_pb/struct_pb_impl.hpp"
)");
Formatter format(&p);
file_generator.generate_source(&p);
}
return true;
}
} // namespace compiler
} // namespace struct_pb