1 Star 0 Fork 11

DengSir/rpc-repo

forked from Plato/rpc-repo 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
javagen_pb_layer.py 4.36 KB
一键复制 编辑 原始数据 按行查看 历史
zhongxiaogang 提交于 2022-05-11 15:33 +08:00 . add java dev tools
import json
import sys
import os
def json_has_attr(json_obj, attr_name):
if json_obj is None:
return False
if attr_name is None:
return False
return (attr_name in json_obj) and (json_obj[attr_name] is not None)
class FileGenerator:
def __init__(self, file_name, pb_json = None, base_package=""):
self.file_name = file_name
self.file_name_split = file_name.split(".")
self.pb_json = pb_json
self.base_package = base_package
self.gen_struct_pb_file()
def gen_struct_pb_file(self):
file = open(self.file_name_split[0] + ".message.proto", "w")
package_name = self.base_package + '.' + self.file_name_split[0];
file.write("// Machine generated code\n\n")
file.write('syntax = "proto3";\n\n')
file.write("package " + package_name + ";\n\n")
file.write('option java_package="'+package_name+'";\n\n')
self.gen_enum_pb_file(file)
if json_has_attr(self.pb_json, "structs"):
for struct in self.pb_json["structs"]:
file.write("message " + struct["name"] + " {\n")
n = 1
if json_has_attr(struct, "fields"):
for field in struct["fields"]:
if field["IdlType"] == "dict":
file.write(" " + field["type"] + "<" + field["key"]["type"] + "," + field["value"]["type"] + "> " + field["name"] + " = " + str(n) + ";\n")
elif field["IdlType"] == "seq" or field["IdlType"] == "set":
file.write(" " + field["type"] + " " + field["key"]["type"] + " " + field["name"] + " = " + str(n) + ";\n")
else:
file.write(" " + field["type"] + " " + field["name"] + " = " + str(n) + ";\n")
n += 1
file.write("}\n\n")
self.gen_method_pb_file(file)
self.gen_method_ret_pb(file)
file.close()
def gen_method_ret_pb(self, file):
for service in self.pb_json["services"]:
for method in service["methods"]:
file.write("message " + service["name"] + "_" + method["name"] + "_ret {\n")
if method["retType"]["IdlType"] == "dict":
file.write(" " + method["retType"]["type"] + "<" + method["retType"]["key"]["type"] + "," + method["retType"]["value"]["type"] + "> " + " ret1 = 1;\n")
elif method["retType"]["IdlType"] == "seq" or method["retType"]["IdlType"] == "set":
file.write(" " + method["retType"]["type"] + " " + method["retType"]["key"]["type"] + " ret1 = 1;\n")
elif method["retType"]["IdlType"] == "void":
pass
else:
file.write(" " + method["retType"]["type"] + " ret1 = 1;\n")
file.write("}\n\n")
def gen_enum_pb_file(self, file):
if not json_has_attr(self.pb_json, "enums"):
return
for enum in self.pb_json["enums"]:
file.write('enum {ename} {{\n default_{ename}=0;\n'.format(ename=enum["name"]));
if "fields" in enum:
for filed in enum["fields"]:
file.write(' {fname}={fvalue};\n'.format(fname=filed["name"], fvalue=filed["value"]))
file.write('}\n\n')
def gen_method_pb_file(self, file):
for service in self.pb_json["services"]:
for method in service["methods"]:
file.write("message " + service["name"] + "_" + method["name"] + "_args {\n")
n = 1
for arg in method["arguments"]:
if arg["IdlType"] == "dict":
file.write(" " + arg["type"] + "<" + arg["key"]["type"] + "," + arg["value"]["type"] + ">")
elif arg["IdlType"] == "seq" or arg["IdlType"] == "set":
file.write(" " + arg["type"] + " " + arg["key"]["type"])
elif arg["IdlType"] == "void":
continue
else:
file.write(" " + arg["type"])
file.write(" arg" + str(n) + " = " + str(n) + ";\n")
n += 1
file.write("}\n\n")
if __name__ == "__main__":
pbjson = json.load(open(sys.argv[1]))
FileGenerator(sys.argv[1], pbjson, sys.argv[2])
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/DengSir/rpc-repo.git
[email protected]:DengSir/rpc-repo.git
DengSir
rpc-repo
rpc-repo
v0.3.0-alpha

搜索帮助