blob: 8266f9af7df92526315a7d849bb16e0af7d63441 [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
from google.protobuf.descriptor import FieldDescriptor as fd
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 unicode
_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: long,
fd.TYPE_SFIXED32: float,
fd.TYPE_SFIXED64: float,
fd.TYPE_SINT32: int,
fd.TYPE_SINT64: long,
fd.TYPE_STRING: unicode,
fd.TYPE_UINT32: int,
fd.TYPE_UINT64: long,
fd.TYPE_MESSAGE: convert
}