// Code generated by protoc-gen-go. DO NOT EDIT.
// source: prototype/channel.proto

package prototype

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	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.ProtoPackageIsVersion3 // please upgrade the proto package

type Channel_Type int32

const (
	Channel_TYPE_UNSPECIFIED Channel_Type = 0
	Channel_CANARY           Channel_Type = 1
	Channel_DEV              Channel_Type = 2
	Channel_BETA             Channel_Type = 3
	Channel_STABLE           Channel_Type = 4
)

var Channel_Type_name = map[int32]string{
	0: "TYPE_UNSPECIFIED",
	1: "CANARY",
	2: "DEV",
	3: "BETA",
	4: "STABLE",
}

var Channel_Type_value = map[string]int32{
	"TYPE_UNSPECIFIED": 0,
	"CANARY":           1,
	"DEV":              2,
	"BETA":             3,
	"STABLE":           4,
}

func (x Channel_Type) String() string {
	return proto.EnumName(Channel_Type_name, int32(x))
}

func (Channel_Type) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_f9715b87c61ad0c9, []int{0, 0}
}

type Channel struct {
	Type                 Channel_Type `protobuf:"varint,1,opt,name=type,proto3,enum=prototype.Channel_Type" json:"type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *Channel) Reset()         { *m = Channel{} }
func (m *Channel) String() string { return proto.CompactTextString(m) }
func (*Channel) ProtoMessage()    {}
func (*Channel) Descriptor() ([]byte, []int) {
	return fileDescriptor_f9715b87c61ad0c9, []int{0}
}

func (m *Channel) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Channel.Unmarshal(m, b)
}
func (m *Channel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Channel.Marshal(b, m, deterministic)
}
func (m *Channel) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Channel.Merge(m, src)
}
func (m *Channel) XXX_Size() int {
	return xxx_messageInfo_Channel.Size(m)
}
func (m *Channel) XXX_DiscardUnknown() {
	xxx_messageInfo_Channel.DiscardUnknown(m)
}

var xxx_messageInfo_Channel proto.InternalMessageInfo

func (m *Channel) GetType() Channel_Type {
	if m != nil {
		return m.Type
	}
	return Channel_TYPE_UNSPECIFIED
}

func init() {
	proto.RegisterEnum("prototype.Channel_Type", Channel_Type_name, Channel_Type_value)
	proto.RegisterType((*Channel)(nil), "prototype.Channel")
}

func init() { proto.RegisterFile("prototype/channel.proto", fileDescriptor_f9715b87c61ad0c9) }

var fileDescriptor_f9715b87c61ad0c9 = []byte{
	// 197 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x2f, 0x28, 0xca, 0x2f,
	0xc9, 0x2f, 0xa9, 0x2c, 0x48, 0xd5, 0x4f, 0xce, 0x48, 0xcc, 0xcb, 0x4b, 0xcd, 0xd1, 0x03, 0x8b,
	0x08, 0x71, 0xc2, 0x25, 0x94, 0xea, 0xb9, 0xd8, 0x9d, 0x21, 0x72, 0x42, 0xda, 0x5c, 0x2c, 0x20,
	0x21, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x3e, 0x23, 0x71, 0x3d, 0xb8, 0x22, 0x3d, 0xa8, 0x0a, 0xbd,
	0x90, 0xca, 0x82, 0xd4, 0x20, 0xb0, 0x22, 0x25, 0x77, 0x2e, 0x16, 0x10, 0x4f, 0x48, 0x84, 0x4b,
	0x20, 0x24, 0x32, 0xc0, 0x35, 0x3e, 0xd4, 0x2f, 0x38, 0xc0, 0xd5, 0xd9, 0xd3, 0xcd, 0xd3, 0xd5,
	0x45, 0x80, 0x41, 0x88, 0x8b, 0x8b, 0xcd, 0xd9, 0xd1, 0xcf, 0x31, 0x28, 0x52, 0x80, 0x51, 0x88,
	0x9d, 0x8b, 0xd9, 0xc5, 0x35, 0x4c, 0x80, 0x49, 0x88, 0x83, 0x8b, 0xc5, 0xc9, 0x35, 0xc4, 0x51,
	0x80, 0x19, 0x24, 0x1d, 0x1c, 0xe2, 0xe8, 0xe4, 0xe3, 0x2a, 0xc0, 0xe2, 0x64, 0x1a, 0x65, 0x9c,
	0x9e, 0xaf, 0x97, 0x9c, 0x51, 0x94, 0x9f, 0x9b, 0x59, 0x9a, 0xab, 0x97, 0x5f, 0x94, 0xae, 0x0f,
	0xe3, 0xe4, 0x17, 0xeb, 0x67, 0xe6, 0xa5, 0x15, 0x25, 0xea, 0x83, 0x5d, 0xa2, 0x9f, 0x9e, 0xaf,
	0x0f, 0x77, 0x52, 0x12, 0x1b, 0x98, 0x69, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xb4, 0xaa, 0x7b,
	0xab, 0xe4, 0x00, 0x00, 0x00,
}
