def describe_message(message_definition):
  message_descriptor = MessageDescriptor()
  message_descriptor.name = message_definition.definition_name().split('.')[-1]

  fields = sorted(message_definition.all_fields(),
                  key=lambda v: v.number)
  if fields:
    message_descriptor.fields = [describe_field(field) for field in fields]

  try:
    nested_messages = message_definition.__messages__
  except AttributeError:
    pass
  else:
    message_descriptors = []
    for name in nested_messages:
      value = getattr(message_definition, name)
      message_descriptors.append(describe_message(value))

    message_descriptor.message_types = message_descriptors

  try:
    nested_enums = message_definition.__enums__
  except AttributeError:
    pass
  else:
    enum_descriptors = []
    for name in nested_enums:
      value = getattr(message_definition, name)
      enum_descriptors.append(describe_enum(value))

    message_descriptor.enum_types = enum_descriptors

  return message_descriptor
Build descriptor for Message class.
dataset/ETHPy150Open AppScale/appscale/AppServer/lib/protorpc/protorpc/descriptor.py/describe_message