// 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/product_bidding_category_level.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 describing the level of the product bidding category.
type ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel int32

const (
	// Not specified.
	ProductBiddingCategoryLevelEnum_UNSPECIFIED ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 0
	// Used for return value only. Represents value unknown in this version.
	ProductBiddingCategoryLevelEnum_UNKNOWN ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 1
	// Level 1.
	ProductBiddingCategoryLevelEnum_LEVEL1 ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 2
	// Level 2.
	ProductBiddingCategoryLevelEnum_LEVEL2 ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 3
	// Level 3.
	ProductBiddingCategoryLevelEnum_LEVEL3 ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 4
	// Level 4.
	ProductBiddingCategoryLevelEnum_LEVEL4 ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 5
	// Level 5.
	ProductBiddingCategoryLevelEnum_LEVEL5 ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel = 6
)

// Enum value maps for ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel.
var (
	ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "LEVEL1",
		3: "LEVEL2",
		4: "LEVEL3",
		5: "LEVEL4",
		6: "LEVEL5",
	}
	ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"LEVEL1":      2,
		"LEVEL2":      3,
		"LEVEL3":      4,
		"LEVEL4":      5,
		"LEVEL5":      6,
	}
)

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

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

func (ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_enumTypes[0].Descriptor()
}

func (ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_enumTypes[0]
}

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

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

// Level of a product bidding category.
type ProductBiddingCategoryLevelEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*ProductBiddingCategoryLevelEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v1_enums_product_bidding_category_level_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_rawDesc = []byte{
	0x0a, 0x42, 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,
	0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x62, 0x69, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x5f,
	0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 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, 0x9a, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x42, 0x69, 0x64,
	0x64, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x76, 0x65,
	0x6c, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x77, 0x0a, 0x1b, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
	0x42, 0x69, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c,
	0x65, 0x76, 0x65, 0x6c, 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, 0x0a, 0x0a, 0x06, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x31, 0x10, 0x02, 0x12, 0x0a,
	0x0a, 0x06, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x32, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x45,
	0x56, 0x45, 0x4c, 0x33, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x34,
	0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x35, 0x10, 0x06, 0x42, 0xf5,
	0x01, 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, 0x20, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x42, 0x69, 0x64,
	0x64, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x76, 0x65,
	0x6c, 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_product_bidding_category_level_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_rawDescData = file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_goTypes = []interface{}{
	(ProductBiddingCategoryLevelEnum_ProductBiddingCategoryLevel)(0), // 0: google.ads.googleads.v1.enums.ProductBiddingCategoryLevelEnum.ProductBiddingCategoryLevel
	(*ProductBiddingCategoryLevelEnum)(nil),                          // 1: google.ads.googleads.v1.enums.ProductBiddingCategoryLevelEnum
}
var file_google_ads_googleads_v1_enums_product_bidding_category_level_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_product_bidding_category_level_proto_init() }
func file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_init() {
	if File_google_ads_googleads_v1_enums_product_bidding_category_level_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ProductBiddingCategoryLevelEnum); 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_product_bidding_category_level_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_product_bidding_category_level_proto = out.File
	file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_product_bidding_category_level_proto_depIdxs = nil
}
