// Code generated by protoc-gen-go. DO NOT EDIT.
// source: multi/multi3.proto

package multitest // import "github.com/golang/protobuf/protoc-gen-go/testdata/multi"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package

type Multi3_HatType int32

const (
	Multi3_FEDORA Multi3_HatType = 1
	Multi3_FEZ    Multi3_HatType = 2
)

var Multi3_HatType_name = map[int32]string{
	1: "FEDORA",
	2: "FEZ",
}
var Multi3_HatType_value = map[string]int32{
	"FEDORA": 1,
	"FEZ":    2,
}

func (x Multi3_HatType) Enum() *Multi3_HatType {
	p := new(Multi3_HatType)
	*p = x
	return p
}
func (x Multi3_HatType) String() string {
	return proto.EnumName(Multi3_HatType_name, int32(x))
}
func (x *Multi3_HatType) UnmarshalJSON(data []byte) error {
	value, err := proto.UnmarshalJSONEnum(Multi3_HatType_value, data, "Multi3_HatType")
	if err != nil {
		return err
	}
	*x = Multi3_HatType(value)
	return nil
}
func (Multi3_HatType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_multi3_d55a72b4628b7875, []int{0, 0}
}

type Multi3 struct {
	HatType              *Multi3_HatType `protobuf:"varint,1,opt,name=hat_type,json=hatType,enum=multitest.Multi3_HatType" json:"hat_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *Multi3) Reset()         { *m = Multi3{} }
func (m *Multi3) String() string { return proto.CompactTextString(m) }
func (*Multi3) ProtoMessage()    {}
func (*Multi3) Descriptor() ([]byte, []int) {
	return fileDescriptor_multi3_d55a72b4628b7875, []int{0}
}
func (m *Multi3) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Multi3.Unmarshal(m, b)
}
func (m *Multi3) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Multi3.Marshal(b, m, deterministic)
}
func (dst *Multi3) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Multi3.Merge(dst, src)
}
func (m *Multi3) XXX_Size() int {
	return xxx_messageInfo_Multi3.Size(m)
}
func (m *Multi3) XXX_DiscardUnknown() {
	xxx_messageInfo_Multi3.DiscardUnknown(m)
}

var xxx_messageInfo_Multi3 proto.InternalMessageInfo

func (m *Multi3) GetHatType() Multi3_HatType {
	if m != nil && m.HatType != nil {
		return *m.HatType
	}
	return Multi3_FEDORA
}

func init() {
	proto.RegisterType((*Multi3)(nil), "multitest.Multi3")
	proto.RegisterEnum("multitest.Multi3_HatType", Multi3_HatType_name, Multi3_HatType_value)
}

func init() { proto.RegisterFile("multi/multi3.proto", fileDescriptor_multi3_d55a72b4628b7875) }

var fileDescriptor_multi3_d55a72b4628b7875 = []byte{
	// 170 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xca, 0x2d, 0xcd, 0x29,
	0xc9, 0xd4, 0x07, 0x93, 0xc6, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0x9c, 0x60, 0x5e, 0x49,
	0x6a, 0x71, 0x89, 0x52, 0x1c, 0x17, 0x9b, 0x2f, 0x58, 0x4a, 0xc8, 0x84, 0x8b, 0x23, 0x23, 0xb1,
	0x24, 0xbe, 0xa4, 0xb2, 0x20, 0x55, 0x82, 0x51, 0x81, 0x51, 0x83, 0xcf, 0x48, 0x52, 0x0f, 0xae,
	0x4e, 0x0f, 0xa2, 0x48, 0xcf, 0x23, 0xb1, 0x24, 0xa4, 0xb2, 0x20, 0x35, 0x88, 0x3d, 0x03, 0xc2,
	0x50, 0x92, 0xe3, 0x62, 0x87, 0x8a, 0x09, 0x71, 0x71, 0xb1, 0xb9, 0xb9, 0xba, 0xf8, 0x07, 0x39,
	0x0a, 0x30, 0x0a, 0xb1, 0x73, 0x31, 0xbb, 0xb9, 0x46, 0x09, 0x30, 0x39, 0x39, 0x47, 0x39, 0xa6,
	0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0xa7, 0xe7, 0xe7, 0x24, 0xe6, 0xa5,
	0xeb, 0x83, 0x5d, 0x91, 0x54, 0x9a, 0x06, 0x61, 0x24, 0xeb, 0xa6, 0xa7, 0xe6, 0xe9, 0xa6, 0xe7,
	0xeb, 0x83, 0x2c, 0x4a, 0x49, 0x2c, 0x49, 0x84, 0x38, 0xd6, 0x1a, 0x6e, 0x39, 0x20, 0x00, 0x00,
	0xff, 0xff, 0xd5, 0xa4, 0x1a, 0x0e, 0xc4, 0x00, 0x00, 0x00,
}
