[gRPC] Update the code generator for Python to produce typed handlers (#8326)

* Move `namer.h` and `idl_namer.h` to `include/codegen` so they can be reused from `grpc` dirqectory.

* [gRPC] Update the Python generator to produce typed handlers and Python stubs if requested.

* [gRPC] Document the newly added compiler flags.
This commit is contained in:
Anton Bobukh
2024-06-18 16:02:57 -07:00
committed by GitHub
parent dafd2f1f29
commit fb9afbafc7
22 changed files with 1177 additions and 665 deletions

View File

@@ -435,47 +435,8 @@ bool GenerateJavaGRPC(const Parser &parser, const std::string &path,
return JavaGRPCGenerator(parser, path, file_name).generate();
}
class PythonGRPCGenerator : public flatbuffers::BaseGenerator {
private:
CodeWriter code_;
public:
PythonGRPCGenerator(const Parser &parser, const std::string &filename)
: BaseGenerator(parser, "", filename, "", "" /*Unused*/, "swift") {}
bool generate() {
code_.Clear();
code_ +=
"# Generated by the gRPC Python protocol compiler plugin. "
"DO NOT EDIT!\n";
code_ += "import grpc\n";
FlatBufFile file(parser_, file_name_, FlatBufFile::kLanguagePython);
for (int i = 0; i < file.service_count(); i++) {
auto service = file.service(i);
code_ += grpc_python_generator::Generate(&file, service.get());
}
const auto final_code = code_.ToString();
const auto filename = GenerateFileName();
return SaveFile(filename.c_str(), final_code, false);
}
std::string GenerateFileName() {
std::string namespace_dir;
auto &namespaces = parser_.namespaces_.back()->components;
for (auto it = namespaces.begin(); it != namespaces.end(); ++it) {
if (it != namespaces.begin()) namespace_dir += kPathSeparator;
namespace_dir += *it;
}
std::string grpc_py_filename = namespace_dir;
if (!namespace_dir.empty()) grpc_py_filename += kPathSeparator;
return grpc_py_filename + file_name_ + "_grpc_fb.py";
}
};
bool GeneratePythonGRPC(const Parser &parser, const std::string & /*path*/,
const std::string &file_name) {
bool GeneratePythonGRPC(const Parser &parser, const std::string &path,
const std::string & /*file_name*/) {
int nservices = 0;
for (auto it = parser.services_.vec.begin(); it != parser.services_.vec.end();
++it) {
@@ -483,7 +444,16 @@ bool GeneratePythonGRPC(const Parser &parser, const std::string & /*path*/,
}
if (!nservices) return true;
return PythonGRPCGenerator(parser, file_name).generate();
flatbuffers::python::Version version{parser.opts.python_version};
if (!version.IsValid()) return false;
if (!flatbuffers::python::grpc::Generate(parser, path, version)) {
return false;
}
if (parser.opts.python_typing) {
return flatbuffers::python::grpc::GenerateStub(parser, path, version);
}
return true;
}
class SwiftGRPCGenerator : public flatbuffers::BaseGenerator {