blob: abec76e1b5ff56d66ecff418b1876a5bc73818fb [file] [log] [blame]
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
import sys
from google.protobuf.descriptor import FieldDescriptor as fd
import six
def convert(pb):
"""Convert protobuf to plain-old-python-object"""
obj = {}
for field, value in pb.ListFields():
if field.label == fd.LABEL_REPEATED:
obj[field.name] = list(_get_json_func(field.type)(v) for v in value)
else:
obj[field.name] = _get_json_func(field.type)(value)
return obj
def _get_json_func(field_type):
if field_type in _FD_TO_JSON:
return _FD_TO_JSON[field_type]
else: # pragma: no cover
logging.warning("pb_to_popo doesn't support converting %s", field_type)
return six.text_type
if sys.version_info.major < 3:
_64bit_type = long
else:
_64bit_type = int
_FD_TO_JSON = {
fd.TYPE_BOOL: bool,
fd.TYPE_DOUBLE: float,
fd.TYPE_ENUM: int,
fd.TYPE_FIXED32: float,
fd.TYPE_FIXED64: float,
fd.TYPE_FLOAT: float,
fd.TYPE_INT32: int,
fd.TYPE_INT64: _64bit_type,
fd.TYPE_SFIXED32: float,
fd.TYPE_SFIXED64: float,
fd.TYPE_SINT32: int,
fd.TYPE_SINT64: _64bit_type,
fd.TYPE_STRING: six.text_type,
fd.TYPE_UINT32: int,
fd.TYPE_UINT64: _64bit_type,
fd.TYPE_MESSAGE: convert
}