# [Pigweed] This file is a checked-in version of a generated protobuf module.
# TODO(pwbug/239) Implement the pw_protobuf_package GN template and Python
#     proto generation, then delete this file.

# pylint: skip-file

# type: ignore

# yapf: disable

# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: pw_rpc/pw_rpc_protos/packet.proto

import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf.internal import enum_type_wrapper
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()




DESCRIPTOR = _descriptor.FileDescriptor(
  name='pw_rpc/pw_rpc_protos/packet.proto',
  package='pw.rpc.internal',
  syntax='proto3',
  serialized_options=None,
  serialized_pb=_b('\n!pw_rpc/pw_rpc_protos/packet.proto\x12\x0fpw.rpc.internal\"\x92\x01\n\tRpcPacket\x12)\n\x04type\x18\x01 \x01(\x0e\x32\x1b.pw.rpc.internal.PacketType\x12\x12\n\nchannel_id\x18\x02 \x01(\r\x12\x12\n\nservice_id\x18\x03 \x01(\x07\x12\x11\n\tmethod_id\x18\x04 \x01(\x07\x12\x0f\n\x07payload\x18\x05 \x01(\x0c\x12\x0e\n\x06status\x18\x06 \x01(\r*\x93\x01\n\nPacketType\x12\x0b\n\x07REQUEST\x10\x00\x12\x15\n\x11\x43LIENT_STREAM_END\x10\x02\x12\x10\n\x0c\x43LIENT_ERROR\x10\x04\x12\x18\n\x14\x43\x41NCEL_SERVER_STREAM\x10\x06\x12\x0c\n\x08RESPONSE\x10\x01\x12\x15\n\x11SERVER_STREAM_END\x10\x03\x12\x10\n\x0cSERVER_ERROR\x10\x05\x62\x06proto3')
)

_PACKETTYPE = _descriptor.EnumDescriptor(
  name='PacketType',
  full_name='pw.rpc.internal.PacketType',
  filename=None,
  file=DESCRIPTOR,
  values=[
    _descriptor.EnumValueDescriptor(
      name='REQUEST', index=0, number=0,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='CLIENT_STREAM_END', index=1, number=2,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='CLIENT_ERROR', index=2, number=4,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='CANCEL_SERVER_STREAM', index=3, number=6,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='RESPONSE', index=4, number=1,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='SERVER_STREAM_END', index=5, number=3,
      serialized_options=None,
      type=None),
    _descriptor.EnumValueDescriptor(
      name='SERVER_ERROR', index=6, number=5,
      serialized_options=None,
      type=None),
  ],
  containing_type=None,
  serialized_options=None,
  serialized_start=204,
  serialized_end=351,
)
_sym_db.RegisterEnumDescriptor(_PACKETTYPE)

PacketType = enum_type_wrapper.EnumTypeWrapper(_PACKETTYPE)
REQUEST = 0
CLIENT_STREAM_END = 2
CLIENT_ERROR = 4
CANCEL_SERVER_STREAM = 6
RESPONSE = 1
SERVER_STREAM_END = 3
SERVER_ERROR = 5



_RPCPACKET = _descriptor.Descriptor(
  name='RpcPacket',
  full_name='pw.rpc.internal.RpcPacket',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='type', full_name='pw.rpc.internal.RpcPacket.type', index=0,
      number=1, type=14, cpp_type=8, 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),
    _descriptor.FieldDescriptor(
      name='channel_id', full_name='pw.rpc.internal.RpcPacket.channel_id', index=1,
      number=2, type=13, cpp_type=3, 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),
    _descriptor.FieldDescriptor(
      name='service_id', full_name='pw.rpc.internal.RpcPacket.service_id', index=2,
      number=3, type=7, cpp_type=3, 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),
    _descriptor.FieldDescriptor(
      name='method_id', full_name='pw.rpc.internal.RpcPacket.method_id', index=3,
      number=4, type=7, cpp_type=3, 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),
    _descriptor.FieldDescriptor(
      name='payload', full_name='pw.rpc.internal.RpcPacket.payload', index=4,
      number=5, type=12, cpp_type=9, label=1,
      has_default_value=False, default_value=_b(""),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='status', full_name='pw.rpc.internal.RpcPacket.status', index=5,
      number=6, type=13, cpp_type=3, 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),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=55,
  serialized_end=201,
)

_RPCPACKET.fields_by_name['type'].enum_type = _PACKETTYPE
DESCRIPTOR.message_types_by_name['RpcPacket'] = _RPCPACKET
DESCRIPTOR.enum_types_by_name['PacketType'] = _PACKETTYPE
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

RpcPacket = _reflection.GeneratedProtocolMessageType('RpcPacket', (_message.Message,), {
  'DESCRIPTOR' : _RPCPACKET,
  '__module__' : 'pw_rpc.pw_rpc_protos.packet_pb2'
  # @@protoc_insertion_point(class_scope:pw.rpc.internal.RpcPacket)
  })
_sym_db.RegisterMessage(RpcPacket)


# @@protoc_insertion_point(module_scope)
