栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

protoc-gen-lua Python3的支持

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

protoc-gen-lua Python3的支持

参考内容:
【1】proto转lua文件参考
https://github.com/u0u0/protoc-gen-lua-bin
【2】使用python3的修改参考
https://xinzhuzi.github.io/2020/05/08/Potobuf-Lua/ProtobufLua/

Protobuf转lua:
下载参考【1】,依据参考【1】介绍可以直接使用。使用参考【1】的能直接使用python2 转换 proto2 内容。

对Python3的支持修改:
1. 替换plugin中的文件,如下内容: 或者直接去下载 https://github.com/sean-lin/protoc-gen-lua/issues/47#issue-1009508582

plugin_pb2.py

# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: google/protobuf/compiler/plugin.proto
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2


DEscriptOR = _descriptor.FileDescriptor(
  name='google/protobuf/compiler/plugin.proto',
  package='google.protobuf.compiler',
  syntax='proto2',
  serialized_options=b'n34com.google.protobuf.compilerB14PluginProtosZ)google.golang.org/protobuf/types/pluginpb',
  create_key=_descriptor._internal_create_key,
  serialized_pb=b'n%google/protobuf/compiler/plugin.protox12x18google.protobuf.compilerx1a google/protobuf/descriptor.proto"Fnx07Versionx12rnx05majorx18x01 x01(x05x12rnx05minorx18x02 x01(x05x12rnx05patchx18x03 x01(x05x12x0enx06suffixx18x04 x01(t"xbax01nx14x43odeGeneratorRequestx12x18nx10x66ile_to_generatex18x01 x03(tx12x11ntparameterx18x02 x01(tx12x38nnproto_filex18x0f x03(x0bx32$.google.protobuf.FileDescriptorProtox12;nx10x63ompiler_versionx18x03 x01(x0bx32!.google.protobuf.compiler.Version"xc1x02nx15x43odeGeneratorResponsex12rnx05x65rrorx18x01 x01(tx12x1anx12supported_featuresx18x02 x01(x04x12x42nx04x66ilex18x0f x03(x0bx32x34.google.protobuf.compiler.CodeGeneratorResponse.Filex1ax7fnx04x46ilex12x0cnx04namex18x01 x01(tx12x17nx0finsertion_pointx18x02 x01(tx12x0fnx07x63ontentx18x0f x01(tx12?nx13generated_code_infox18x10 x01(x0bx32".google.protobuf.GeneratedCodeInfo"8nx07x46x65x61turex12x10nx0cx46x45x41TURE_NONEx10x00x12x1bnx17x46x45x41TURE_PROTO3_OPTIONALx10x01x42Wnx1cx63om.google.protobuf.compilerBx0cPluginProtosZ)google.golang.org/protobuf/types/pluginpb'
  ,
  dependencies=[google_dot_protobuf_dot_descriptor__pb2.DEscriptOR,])



_CODEGENERATORRESPONSE_FEATURE = _descriptor.EnumDescriptor(
  name='Feature',
  full_name='google.protobuf.compiler.CodeGeneratorResponse.Feature',
  filename=None,
  file=DEscriptOR,
  create_key=_descriptor._internal_create_key,
  values=[
    _descriptor.EnumValueDescriptor(
      name='FEATURE_NONE', index=0, number=0,
      serialized_options=None,
      type=None,
      create_key=_descriptor._internal_create_key),
    _descriptor.EnumValueDescriptor(
      name='FEATURE_PROTO3_OPTIONAL', index=1, number=1,
      serialized_options=None,
      type=None,
      create_key=_descriptor._internal_create_key),
  ],
  containing_type=None,
  serialized_options=None,
  serialized_start=628,
  serialized_end=684,
)
_sym_db.RegisterEnumDescriptor(_CODEGENERATORRESPONSE_FEATURE)


_VERSION = _descriptor.Descriptor(
  name='Version',
  full_name='google.protobuf.compiler.Version',
  filename=None,
  file=DEscriptOR,
  containing_type=None,
  create_key=_descriptor._internal_create_key,
  fields=[
    _descriptor.FieldDescriptor(
      name='major', full_name='google.protobuf.compiler.Version.major', index=0,
      number=1, type=5, cpp_type=1, label=1,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='minor', full_name='google.protobuf.compiler.Version.minor', index=1,
      number=2, type=5, cpp_type=1, label=1,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='patch', full_name='google.protobuf.compiler.Version.patch', index=2,
      number=3, type=5, cpp_type=1, label=1,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='suffix', full_name='google.protobuf.compiler.Version.suffix', index=3,
      number=4, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=b"".decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=101,
  serialized_end=171,
)


_CODEGENERATORREQUEST = _descriptor.Descriptor(
  name='CodeGeneratorRequest',
  full_name='google.protobuf.compiler.CodeGeneratorRequest',
  filename=None,
  file=DEscriptOR,
  containing_type=None,
  create_key=_descriptor._internal_create_key,
  fields=[
    _descriptor.FieldDescriptor(
      name='file_to_generate', full_name='google.protobuf.compiler.CodeGeneratorRequest.file_to_generate', index=0,
      number=1, type=9, cpp_type=9, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='parameter', full_name='google.protobuf.compiler.CodeGeneratorRequest.parameter', index=1,
      number=2, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=b"".decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='proto_file', full_name='google.protobuf.compiler.CodeGeneratorRequest.proto_file', index=2,
      number=15, type=11, cpp_type=10, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='compiler_version', full_name='google.protobuf.compiler.CodeGeneratorRequest.compiler_version', index=3,
      number=3, type=11, cpp_type=10, label=1,
      has_default_value=False, default_value=None,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=174,
  serialized_end=360,
)


_CODEGENERATORRESPONSE_FILE = _descriptor.Descriptor(
  name='File',
  full_name='google.protobuf.compiler.CodeGeneratorResponse.File',
  filename=None,
  file=DEscriptOR,
  containing_type=None,
  create_key=_descriptor._internal_create_key,
  fields=[
    _descriptor.FieldDescriptor(
      name='name', full_name='google.protobuf.compiler.CodeGeneratorResponse.File.name', index=0,
      number=1, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=b"".decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='insertion_point', full_name='google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point', index=1,
      number=2, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=b"".decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='content', full_name='google.protobuf.compiler.CodeGeneratorResponse.File.content', index=2,
      number=15, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=b"".decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='generated_code_info', full_name='google.protobuf.compiler.CodeGeneratorResponse.File.generated_code_info', index=3,
      number=16, type=11, cpp_type=10, label=1,
      has_default_value=False, default_value=None,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=499,
  serialized_end=626,
)

_CODEGENERATORRESPonSE = _descriptor.Descriptor(
  name='CodeGeneratorResponse',
  full_name='google.protobuf.compiler.CodeGeneratorResponse',
  filename=None,
  file=DEscriptOR,
  containing_type=None,
  create_key=_descriptor._internal_create_key,
  fields=[
    _descriptor.FieldDescriptor(
      name='error', full_name='google.protobuf.compiler.CodeGeneratorResponse.error', index=0,
      number=1, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=b"".decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='supported_features', full_name='google.protobuf.compiler.CodeGeneratorResponse.supported_features', index=1,
      number=2, type=4, cpp_type=4, label=1,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='file', full_name='google.protobuf.compiler.CodeGeneratorResponse.file', index=2,
      number=15, type=11, cpp_type=10, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DEscriptOR,  create_key=_descriptor._internal_create_key),
  ],
  extensions=[
  ],
  nested_types=[_CODEGENERATORRESPONSE_FILE, ],
  enum_types=[
    _CODEGENERATORRESPONSE_FEATURE,
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto2',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=363,
  serialized_end=684,
)

_CODEGENERATORREQUEST.fields_by_name['proto_file'].message_type = google_dot_protobuf_dot_descriptor__pb2._FILEDEscriptORPROTO
_CODEGENERATORREQUEST.fields_by_name['compiler_version'].message_type = _VERSION
_CODEGENERATORRESPONSE_FILE.fields_by_name['generated_code_info'].message_type = google_dot_protobuf_dot_descriptor__pb2._GENERATEDCODEINFO
_CODEGENERATORRESPONSE_FILE.containing_type = _CODEGENERATORRESPonSE
_CODEGENERATORRESPONSE.fields_by_name['file'].message_type = _CODEGENERATORRESPONSE_FILE
_CODEGENERATORRESPONSE_FEATURE.containing_type = _CODEGENERATORRESPonSE
DEscriptOR.message_types_by_name['Version'] = _VERSION
DEscriptOR.message_types_by_name['CodeGeneratorRequest'] = _CODEGENERATORREQUEST
DEscriptOR.message_types_by_name['CodeGeneratorResponse'] = _CODEGENERATORRESPonSE
_sym_db.RegisterFileDescriptor(DEscriptOR)

Version = _reflection.GeneratedProtocolMessageType('Version', (_message.Message,), {
  'DEscriptOR' : _VERSION,
  '__module__' : 'google.protobuf.compiler.plugin_pb2'
  # @@protoc_insertion_point(class_scope:google.protobuf.compiler.Version)
  })
_sym_db.RegisterMessage(Version)

CodeGeneratorRequest = _reflection.GeneratedProtocolMessageType('CodeGeneratorRequest', (_message.Message,), {
  'DEscriptOR' : _CODEGENERATORREQUEST,
  '__module__' : 'google.protobuf.compiler.plugin_pb2'
  # @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorRequest)
  })
_sym_db.RegisterMessage(CodeGeneratorRequest)

CodeGeneratorResponse = _reflection.GeneratedProtocolMessageType('CodeGeneratorResponse', (_message.Message,), {

  'File' : _reflection.GeneratedProtocolMessageType('File', (_message.Message,), {
    'DEscriptOR' : _CODEGENERATORRESPONSE_FILE,
    '__module__' : 'google.protobuf.compiler.plugin_pb2'
    # @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse.File)
    })
  ,
  'DEscriptOR' : _CODEGENERATORRESPONSE,
  '__module__' : 'google.protobuf.compiler.plugin_pb2'
  # @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse)
  })
_sym_db.RegisterMessage(CodeGeneratorResponse)
_sym_db.RegisterMessage(CodeGeneratorResponse.File)


DEscriptOR._options = None
# @@protoc_insertion_point(module_scope)

protoc-gen-lua

#!/usr/bin/env python
# -*- encoding:utf8 -*-
# protoc-gen-erl
# Google's Protocol Buffers project, ported to lua.
# https://code.google.com/p/protoc-gen-lua/
#
# Copyright (c) 2010 , 林卓毅 (Zhuoyi Lin) netsnail@gmail.com
# All rights reserved.
#
# Use, modification and distribution are subject to the "New BSD License"
# as listed at .

import sys
import os.path as path
from io import StringIO

import plugin_pb2
import google.protobuf.descriptor_pb2 as descriptor_pb2

_packages = {}
_files = {}
_message = {}

FDP = plugin_pb2.google_dot_protobuf_dot_descriptor__pb2.FieldDescriptorProto

if sys.platform == "win32":
    import msvcrt, os
    msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

class CppType:
    CPPTYPE_INT32       = 1
    CPPTYPE_INT64       = 2
    CPPTYPE_UINT32      = 3
    CPPTYPE_UINT64      = 4
    CPPTYPE_DOUBLE      = 5
    CPPTYPE_FLOAT       = 6
    CPPTYPE_BOOL        = 7
    CPPTYPE_ENUM        = 8
    CPPTYPE_STRING      = 9
    CPPTYPE_MESSAGE     = 10

CPP_TYPE ={
    FDP.TYPE_DOUBLE         : CppType.CPPTYPE_DOUBLE,
    FDP.TYPE_FLOAT          : CppType.CPPTYPE_FLOAT,
    FDP.TYPE_INT64          : CppType.CPPTYPE_INT64,
    FDP.TYPE_UINT64         : CppType.CPPTYPE_UINT64,
    FDP.TYPE_INT32          : CppType.CPPTYPE_INT32,
    FDP.TYPE_FIXED64        : CppType.CPPTYPE_UINT64,
    FDP.TYPE_FIXED32        : CppType.CPPTYPE_UINT32,
    FDP.TYPE_BOOL           : CppType.CPPTYPE_BOOL,
    FDP.TYPE_STRING         : CppType.CPPTYPE_STRING,
    FDP.TYPE_MESSAGE        : CppType.CPPTYPE_MESSAGE,
    FDP.TYPE_BYTES          : CppType.CPPTYPE_STRING,
    FDP.TYPE_UINT32         : CppType.CPPTYPE_UINT32,
    FDP.TYPE_ENUM           : CppType.CPPTYPE_ENUM,
    FDP.TYPE_SFIXED32       : CppType.CPPTYPE_INT32,
    FDP.TYPE_SFIXED64       : CppType.CPPTYPE_INT64,
    FDP.TYPE_SINT32         : CppType.CPPTYPE_INT32,
    FDP.TYPE_SINT64         : CppType.CPPTYPE_INT64
}

def printerr(*args):
    sys.stderr.write(" ".join(args))
    sys.stderr.write("n")
    sys.stderr.flush()

class TreeNode(object):
    def __init__(self, name, parent=None, filename=None, package=None):
        super(TreeNode, self).__init__()
        self.child = []
        self.parent = parent
        self.filename = filename
        self.package = package
        if parent:
            self.parent.add_child(self)
        self.name = name

    def add_child(self, child):
        self.child.append(child)

    def find_child(self, child_names):
        if child_names:
            for i in self.child:
                if i.name == child_names[0]:
                    return i.find_child(child_names[1:])
            raise StandardError
        else:
            return self

    def get_child(self, child_name):
        for i in self.child:
            if i.name == child_name:
                return i
        return None

    def get_path(self, end = None):
        pos = self
        out = []
        while pos and pos != end:
            out.append(pos.name)
            pos = pos.parent
        out.reverse()
        return '.'.join(out)

    def get_global_name(self):
        return self.get_path()

    def get_local_name(self):
        pos = self
        while pos.parent:
            pos = pos.parent
            if self.package and pos.name == self.package[-1]:
                break
        return self.get_path(pos)

    def __str__(self):
        return self.to_string(0)

    def __repr__(self):
        return str(self)

    def to_string(self, indent = 0):
        return ' '*indent + 'n'

class Env(object):
    filename = None
    package = None
    extend = None
    descriptor = None
    message = None
    context = None
    register = None
    def __init__(self):
        self.message_tree = TreeNode('')
        self.scope = self.message_tree

    def get_global_name(self):
        return self.scope.get_global_name()

    def get_local_name(self):
        return self.scope.get_local_name()

    def get_ref_name(self, type_name):
        try:
            node = self.lookup_name(type_name)
        except:
            # if the child doesn't be founded, it must be in this file
            return type_name[len('.'.join(self.package)) + 1:]
        if node.filename != self.filename:
            return node.filename + '_pb.' + node.get_local_name()
        return node.get_local_name()

    def lookup_name(self, name):
        names = name.split('.')
        if names[0] == '':
            return self.message_tree.find_child(names[1:])
        else:
            return self.scope.parent.find_child(names)

    def enter_package(self, package):
        if not package:
            return self.message_tree
        names = package.split('.')
        pos = self.message_tree
        for i, name in enumerate(names):
            new_pos = pos.get_child(name)
            if new_pos:
                pos = new_pos
            else:
                return self._build_nodes(pos, names[i:])
        return pos

    def enter_file(self, filename, package):
        self.filename = filename
        self.package = package.split('.')
        self._init_field()
        self.scope = self.enter_package(package)

    def exit_file(self):
        self._init_field()
        self.filename = None
        self.package = []
        self.scope = self.scope.parent

    def enter(self, message_name):
        self.scope = TreeNode(message_name, self.scope, self.filename,
                              self.package)

    def exit(self):
        self.scope = self.scope.parent

    def _init_field(self):
        self.descriptor = []
        self.context = []
        self.message = []
        self.register = []

    def _build_nodes(self, node, names):
        parent = node
        for i in names:
            parent = TreeNode(i, parent, self.filename, self.package)
        return parent

class Writer(object):
    def __init__(self, prefix=None):
        self.io = StringIO()
        self.__indent = ''
        self.__prefix = prefix

    def getvalue(self):
        return self.io.getvalue()

    def __enter__(self):
        self.__indent += '    '
        return self

    def __exit__(self, type, value, trackback):
        self.__indent = self.__indent[:-4]

    def __call__(self, data):
        self.io.write(self.__indent)
        if self.__prefix:
            self.io.write(self.__prefix)
        self.io.write(data)

DEFAULT_VALUE = {
    FDP.TYPE_DOUBLE         : '0.0',
    FDP.TYPE_FLOAT          : '0.0',
    FDP.TYPE_INT64          : '0',
    FDP.TYPE_UINT64         : '0',
    FDP.TYPE_INT32          : '0',
    FDP.TYPE_FIXED64        : '0',
    FDP.TYPE_FIXED32        : '0',
    FDP.TYPE_BOOL           : 'false',
    FDP.TYPE_STRING         : '""',
    FDP.TYPE_MESSAGE        : 'nil',
    FDP.TYPE_BYTES          : '""',
    FDP.TYPE_UINT32         : '0',
    FDP.TYPE_ENUM           : '1',
    FDP.TYPE_SFIXED32       : '0',
    FDP.TYPE_SFIXED64       : '0',
    FDP.TYPE_SINT32         : '0',
    FDP.TYPE_SINT64         : '0',
}

def code_gen_enum_item(index, enum_value, env):
    full_name = env.get_local_name() + '.' + enum_value.name
    obj_name = full_name.upper().replace('.', '_') + '_ENUM'
    env.descriptor.append(
        "local %s = protobuf.EnumValueDescriptor();n"% obj_name
    )

    context = Writer(obj_name)
    context('.name = "%s"n' % enum_value.name)
    context('.index = %dn' % index)
    context('.number = %dn' % enum_value.number)

    env.context.append(context.getvalue())
    return obj_name

def code_gen_enum(enum_desc, env):
    env.enter(enum_desc.name)
    full_name = env.get_local_name()
    obj_name = full_name.upper().replace('.', '_')
    env.descriptor.append(
        "local %s = protobuf.EnumDescriptor();n"% obj_name
    )

    context = Writer(obj_name)
    context('.name = "%s"n' % enum_desc.name)
    context('.full_name = "%s"n' % env.get_global_name())

    values = []
    for i, enum_value in enumerate(enum_desc.value):
        values.append(code_gen_enum_item(i, enum_value, env))
    context('.values = {%s}n' % ','.join(values))

    env.context.append(context.getvalue())
    env.exit()
    return obj_name

def code_gen_field(index, field_desc, env):
    full_name = env.get_local_name() + '.' + field_desc.name
    obj_name = full_name.upper().replace('.', '_') + '_FIELD'
    env.descriptor.append(
        "local %s = protobuf.FieldDescriptor();n"% obj_name
    )

    context = Writer(obj_name)

    context('.name = "%s"n' % field_desc.name)
    context('.full_name = "%s"n' % (
        env.get_global_name() + '.' + field_desc.name))
    context('.number = %dn' % field_desc.number)
    context('.index = %dn' % index)
    context('.label = %dn' % field_desc.label)

    if field_desc.HasField("default_value"):
        context('.has_default_value = truen')
        value = field_desc.default_value
        if field_desc.type == FDP.TYPE_STRING:
            context('.default_value = "%s"n'%value)
        else:
            context('.default_value = %sn'%value)
    else:
        context('.has_default_value = falsen')
        if field_desc.label == FDP.LABEL_REPEATED:
            default_value = "{}"
        elif field_desc.HasField('type_name'):
            default_value = "nil"
        else:
            default_value = DEFAULT_VALUE[field_desc.type]
        context('.default_value = %sn' % default_value)

    if field_desc.HasField('type_name'):
        type_name = env.get_ref_name(field_desc.type_name).upper().replace('.', '_')
        if field_desc.type == FDP.TYPE_MESSAGE:
            context('.message_type = %sn' % type_name)
        else:
            context('.enum_type = %sn' % type_name)

    if field_desc.HasField('extendee'):
        type_name = env.get_ref_name(field_desc.extendee)
        env.register.append(
            "%s.RegisterExtension(%s)n" % (type_name, obj_name)
        )

    context('.type = %dn' % field_desc.type)
    context('.cpp_type = %dnn' % CPP_TYPE[field_desc.type])
    env.context.append(context.getvalue())
    return obj_name

def code_gen_message(message_descriptor, env, containing_type = None):
    env.enter(message_descriptor.name)
    full_name = env.get_local_name()
    obj_name = full_name.upper().replace('.', '_')
    env.descriptor.append(
        "local %s = protobuf.Descriptor();n"% obj_name
    )

    context = Writer(obj_name)
    context('.name = "%s"n' % message_descriptor.name)
    context('.full_name = "%s"n' % env.get_global_name())

    nested_types = []
    for msg_desc in message_descriptor.nested_type:
        msg_name = code_gen_message(msg_desc, env, obj_name)
        nested_types.append(msg_name)
    context('.nested_types = {%s}n' % ', '.join(nested_types))

    enums = []
    for enum_desc in message_descriptor.enum_type:
        enums.append(code_gen_enum(enum_desc, env))
    context('.enum_types = {%s}n' % ', '.join(enums))

    fields = []
    for i, field_desc in enumerate(message_descriptor.field):
        fields.append(code_gen_field(i, field_desc, env))

    context('.fields = {%s}n' % ', '.join(fields))
    if len(message_descriptor.extension_range) > 0:
        context('.is_extendable = truen')
    else:
        context('.is_extendable = falsen')

    extensions = []
    for i, field_desc in enumerate(message_descriptor.extension):
        extensions.append(code_gen_field(i, field_desc, env))
    context('.extensions = {%s}n' % ', '.join(extensions))

    if containing_type:
        context('.containing_type = %sn' % containing_type)

    env.message.append('%s = protobuf.Message(%s)n' % (full_name,
                                                        obj_name))

    env.context.append(context.getvalue())
    env.exit()
    return obj_name

def write_header(writer):
    writer("""-- Generated By protoc-gen-lua Do not Edit
""")

def code_gen_file(proto_file, env, is_gen):
    filename = path.splitext(proto_file.name)[0]
    env.enter_file(filename, proto_file.package)

    includes = []
    for f in proto_file.dependency:
        inc_file = path.splitext(f)[0]
        includes.append(inc_file)

#    for field_desc in proto_file.extension:
#        code_gen_extensions(field_desc, field_desc.name, env)

    for enum_desc in proto_file.enum_type:
        code_gen_enum(enum_desc, env)
        for enum_value in enum_desc.value:
            env.message.append('%s = %dn' % (enum_value.name,
                                              enum_value.number))

    for msg_desc in proto_file.message_type:
        code_gen_message(msg_desc, env)

    if is_gen:
        lua = Writer()
        write_header(lua)
        lua('local protobuf = require "protobuf"n')
        for i in includes:
            lua('local %s_pb = require("%s_pb")n' % (i, i))
        lua("module('%s_pb')n" % env.filename)

        lua('nn')
        # map(lua, env.descriptor)
        for des in env.descriptor:
            lua(des)
        lua('n')
        # map(lua, env.context)
        for des in env.context:
            lua(des)
        lua('n')
        env.message.sort()
        # map(lua, env.message)
        for des in env.message:
            lua(des)
        lua('n')
        # map(lua, env.register)
        for des in env.register:
            lua(des)

        _files[env.filename+ '_pb.lua'] = lua.getvalue()
    env.exit_file()

def main():
    plugin_require_bin = sys.stdin.buffer.read()
    code_gen_req = plugin_pb2.CodeGeneratorRequest()
    code_gen_req.ParseFromString(plugin_require_bin)

    env = Env()
    for proto_file in code_gen_req.proto_file:
        code_gen_file(proto_file, env,
                proto_file.name in code_gen_req.file_to_generate)

    code_generated = plugin_pb2.CodeGeneratorResponse()
    for k in  _files:
        file_desc = code_generated.file.add()
        file_desc.name = k
        file_desc.content = _files[k]

    sys.stdout.buffer.write(code_generated.SerializeToString())

if __name__ == "__main__":
    main()


部署:
下载protoc-gen-lua(按上文修改成python3 和 protoc3 版本)
建立软连接 $cd /usr/local/bin && sudo ln -s /path/to/protoc-gen-lua/plugin/protoc-gen-lua
本地环境: /usr/bin/python -> /usr/local/bin/python3 默认的python环境指向python3
本地安装 protoc3

测试
cd /root/protoc-gen-lua/example

protoc --lua_out=./ person.proto

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/272895.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号