// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/ads/googleads/v1/enums/criterion_category_channel_availability_mode.proto

package enums

import (
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

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)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// Enum containing the possible CriterionCategoryChannelAvailabilityMode.
type CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode int32

const (
	// Not specified.
	CriterionCategoryChannelAvailabilityModeEnum_UNSPECIFIED CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode = 0
	// Used for return value only. Represents value unknown in this version.
	CriterionCategoryChannelAvailabilityModeEnum_UNKNOWN CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode = 1
	// The category is available to campaigns of all channel types and subtypes.
	CriterionCategoryChannelAvailabilityModeEnum_ALL_CHANNELS CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode = 2
	// The category is available to campaigns of a specific channel type,
	// including all subtypes under it.
	CriterionCategoryChannelAvailabilityModeEnum_CHANNEL_TYPE_AND_ALL_SUBTYPES CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode = 3
	// The category is available to campaigns of a specific channel type and
	// subtype(s).
	CriterionCategoryChannelAvailabilityModeEnum_CHANNEL_TYPE_AND_SUBSET_SUBTYPES CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode = 4
)

// Enum value maps for CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode.
var (
	CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "ALL_CHANNELS",
		3: "CHANNEL_TYPE_AND_ALL_SUBTYPES",
		4: "CHANNEL_TYPE_AND_SUBSET_SUBTYPES",
	}
	CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode_value = map[string]int32{
		"UNSPECIFIED":                      0,
		"UNKNOWN":                          1,
		"ALL_CHANNELS":                     2,
		"CHANNEL_TYPE_AND_ALL_SUBTYPES":    3,
		"CHANNEL_TYPE_AND_SUBSET_SUBTYPES": 4,
	}
)

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

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

func (CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_enumTypes[0].Descriptor()
}

func (CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_enumTypes[0]
}

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

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

// Describes channel availability mode for a criterion availability - whether
// the availability is meant to include all advertising channels, or a
// particular channel with all its channel subtypes, or a channel with a certain
// subset of channel subtypes.
type CriterionCategoryChannelAvailabilityModeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*CriterionCategoryChannelAvailabilityModeEnum) ProtoMessage() {}

func (x *CriterionCategoryChannelAvailabilityModeEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_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 CriterionCategoryChannelAvailabilityModeEnum.ProtoReflect.Descriptor instead.
func (*CriterionCategoryChannelAvailabilityModeEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_rawDesc = []byte{
	0x0a, 0x50, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f,
	0x72, 0x79, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c,
	0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x12, 0x1d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x65, 0x6e, 0x75, 0x6d,
	0x73, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e,
	0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
	0xd4, 0x01, 0x0a, 0x2c, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x74,
	0x65, 0x67, 0x6f, 0x72, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x76, 0x61, 0x69,
	0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x75, 0x6d,
	0x22, 0xa3, 0x01, 0x0a, 0x28, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x6e, 0x43, 0x61,
	0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x76, 0x61,
	0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0f, 0x0a,
	0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b,
	0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x41,
	0x4c, 0x4c, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x53, 0x10, 0x02, 0x12, 0x21, 0x0a,
	0x1d, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e,
	0x44, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x53, 0x10, 0x03,
	0x12, 0x24, 0x0a, 0x20, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45,
	0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x45, 0x54, 0x5f, 0x53, 0x55, 0x42, 0x54,
	0x59, 0x50, 0x45, 0x53, 0x10, 0x04, 0x42, 0x82, 0x02, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x61, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x2d, 0x43, 0x72,
	0x69, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x43,
	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69,
	0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67,
	0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,
	0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x3b, 0x65, 0x6e, 0x75, 0x6d,
	0x73, 0xa2, 0x02, 0x03, 0x47, 0x41, 0x41, 0xaa, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x41, 0x64, 0x73, 0x2e, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x2e, 0x56,
	0x31, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0xca, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x5c, 0x41, 0x64, 0x73, 0x5c, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x5c, 0x56,
	0x31, 0x5c, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0xea, 0x02, 0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x3a, 0x3a, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73,
	0x3a, 0x3a, 0x56, 0x31, 0x3a, 0x3a, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_rawDescData = file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_goTypes = []interface{}{
	(CriterionCategoryChannelAvailabilityModeEnum_CriterionCategoryChannelAvailabilityMode)(0), // 0: google.ads.googleads.v1.enums.CriterionCategoryChannelAvailabilityModeEnum.CriterionCategoryChannelAvailabilityMode
	(*CriterionCategoryChannelAvailabilityModeEnum)(nil),                                       // 1: google.ads.googleads.v1.enums.CriterionCategoryChannelAvailabilityModeEnum
}
var file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() {
	file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_init()
}
func file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_init() {
	if File_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CriterionCategoryChannelAvailabilityModeEnum); 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_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto = out.File
	file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_criterion_category_channel_availability_mode_proto_depIdxs = nil
}
