// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: prototype/channel.proto

package prototype

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

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
)

// Enum value maps for Channel_Type.
var (
	Channel_Type_name = map[int32]string{
		0: "TYPE_UNSPECIFIED",
		1: "CANARY",
		2: "DEV",
		3: "BETA",
		4: "STABLE",
	}
	Channel_Type_value = map[string]int32{
		"TYPE_UNSPECIFIED": 0,
		"CANARY":           1,
		"DEV":              2,
		"BETA":             3,
		"STABLE":           4,
	}
)

func (x Channel_Type) Enum() *Channel_Type {
	p := new(Channel_Type)
	*p = x
	return p
}

func (x Channel_Type) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Channel_Type) Descriptor() protoreflect.EnumDescriptor {
	return file_prototype_channel_proto_enumTypes[0].Descriptor()
}

func (Channel_Type) Type() protoreflect.EnumType {
	return &file_prototype_channel_proto_enumTypes[0]
}

func (x Channel_Type) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Channel_Type.Descriptor instead.
func (Channel_Type) EnumDescriptor() ([]byte, []int) {
	return file_prototype_channel_proto_rawDescGZIP(), []int{0, 0}
}

type Channel struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Type Channel_Type `protobuf:"varint,1,opt,name=type,proto3,enum=prototype.Channel_Type" json:"type,omitempty"`
}

func (x *Channel) Reset() {
	*x = Channel{}
	if protoimpl.UnsafeEnabled {
		mi := &file_prototype_channel_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Channel) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Channel) ProtoMessage() {}

func (x *Channel) ProtoReflect() protoreflect.Message {
	mi := &file_prototype_channel_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Channel.ProtoReflect.Descriptor instead.
func (*Channel) Descriptor() ([]byte, []int) {
	return file_prototype_channel_proto_rawDescGZIP(), []int{0}
}

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

var File_prototype_channel_proto protoreflect.FileDescriptor

var file_prototype_channel_proto_rawDesc = []byte{
	0x0a, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x63, 0x68, 0x61, 0x6e,
	0x6e, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x74, 0x79, 0x70, 0x65, 0x22, 0x7f, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12,
	0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,
	0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x47, 0x0a, 0x04,
	0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53,
	0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x41,
	0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x45, 0x56, 0x10, 0x02, 0x12,
	0x08, 0x0a, 0x04, 0x42, 0x45, 0x54, 0x41, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x41,
	0x42, 0x4c, 0x45, 0x10, 0x04, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
	0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x62, 0x06, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_prototype_channel_proto_rawDescOnce sync.Once
	file_prototype_channel_proto_rawDescData = file_prototype_channel_proto_rawDesc
)

func file_prototype_channel_proto_rawDescGZIP() []byte {
	file_prototype_channel_proto_rawDescOnce.Do(func() {
		file_prototype_channel_proto_rawDescData = protoimpl.X.CompressGZIP(file_prototype_channel_proto_rawDescData)
	})
	return file_prototype_channel_proto_rawDescData
}

var file_prototype_channel_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_prototype_channel_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_prototype_channel_proto_goTypes = []interface{}{
	(Channel_Type)(0), // 0: prototype.Channel.Type
	(*Channel)(nil),   // 1: prototype.Channel
}
var file_prototype_channel_proto_depIdxs = []int32{
	0, // 0: prototype.Channel.type:type_name -> prototype.Channel.Type
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_prototype_channel_proto_init() }
func file_prototype_channel_proto_init() {
	if File_prototype_channel_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_prototype_channel_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Channel); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_prototype_channel_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_prototype_channel_proto_goTypes,
		DependencyIndexes: file_prototype_channel_proto_depIdxs,
		EnumInfos:         file_prototype_channel_proto_enumTypes,
		MessageInfos:      file_prototype_channel_proto_msgTypes,
	}.Build()
	File_prototype_channel_proto = out.File
	file_prototype_channel_proto_rawDesc = nil
	file_prototype_channel_proto_goTypes = nil
	file_prototype_channel_proto_depIdxs = nil
}
