1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# Protocol Buffers - Google's data interchange format
2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# Copyright 2008 Google Inc.  All rights reserved.
3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# http://code.google.com/p/protobuf/
4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#
5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# Redistribution and use in source and binary forms, with or without
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# modification, are permitted provided that the following conditions are
7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# met:
8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#     * Redistributions of source code must retain the above copyright
10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# notice, this list of conditions and the following disclaimer.
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#     * Redistributions in binary form must reproduce the above
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# copyright notice, this list of conditions and the following disclaimer
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# in the documentation and/or other materials provided with the
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# distribution.
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#     * Neither the name of Google Inc. nor the names of its
16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# contributors may be used to endorse or promote products derived from
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# this software without specific prior written permission.
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch"""A simple wrapper around enum types to expose utility functions.
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochInstances are created as properties with the same name as the enum they wrap
34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochon proto classes.  For usage, see:
35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  reflection_test.py
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch"""
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch__author__ = 'rabsatt@google.com (Kevin Rabsatt)'
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass EnumTypeWrapper(object):
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  """A utility for finding the names of enum values."""
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DESCRIPTOR = None
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def __init__(self, enum_type):
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """Inits EnumTypeWrapper with an EnumDescriptor."""
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self._enum_type = enum_type
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.DESCRIPTOR = enum_type;
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def Name(self, number):
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """Returns a string containing the name of an enum value."""
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if number in self._enum_type.values_by_number:
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return self._enum_type.values_by_number[number].name
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    raise ValueError('Enum %s has no name defined for value %d' % (
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        self._enum_type.name, number))
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def Value(self, name):
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """Returns the value coresponding to the given enum name."""
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if name in self._enum_type.values_by_name:
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return self._enum_type.values_by_name[name].number
62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    raise ValueError('Enum %s has no value defined for name %s' % (
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        self._enum_type.name, name))
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def keys(self):
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """Return a list of the string names in the enum.
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    These are returned in the order they were defined in the .proto file.
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return [value_descriptor.name
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            for value_descriptor in self._enum_type.values]
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def values(self):
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """Return a list of the integer values in the enum.
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    These are returned in the order they were defined in the .proto file.
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return [value_descriptor.number
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            for value_descriptor in self._enum_type.values]
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def items(self):
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """Return a list of the (name, value) pairs of the enum.
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    These are returned in the order they were defined in the .proto file.
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return [(value_descriptor.name, value_descriptor.number)
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            for value_descriptor in self._enum_type.values]
90