// 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/v2/enums/product_bidding_category_status.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 status of the product bidding category.
type ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus int32

const (
	// Not specified.
	ProductBiddingCategoryStatusEnum_UNSPECIFIED ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus = 0
	// Used for return value only. Represents value unknown in this version.
	ProductBiddingCategoryStatusEnum_UNKNOWN ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus = 1
	// The category is active and can be used for bidding.
	ProductBiddingCategoryStatusEnum_ACTIVE ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus = 2
	// The category is obsolete. Used only for reporting purposes.
	ProductBiddingCategoryStatusEnum_OBSOLETE ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus = 3
)

// Enum value maps for ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus.
var (
	ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "ACTIVE",
		3: "OBSOLETE",
	}
	ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"ACTIVE":      2,
		"OBSOLETE":    3,
	}
)

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

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

func (ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_enumTypes[0].Descriptor()
}

func (ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_enumTypes[0]
}

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

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

// Status of the product bidding category.
type ProductBiddingCategoryStatusEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*ProductBiddingCategoryStatusEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v2_enums_product_bidding_category_status_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_rawDesc = []byte{
	0x0a, 0x43, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x32, 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, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x32, 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, 0x7a, 0x0a, 0x20, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x42, 0x69, 0x64,
	0x64, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74,
	0x75, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x56, 0x0a, 0x1c, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,
	0x74, 0x42, 0x69, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,
	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02,
	0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x42, 0x53, 0x4f, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x42, 0xf6,
	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, 0x32, 0x2e, 0x65,
	0x6e, 0x75, 0x6d, 0x73, 0x42, 0x21, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x42, 0x69, 0x64,
	0x64, 0x69, 0x6e, 0x67, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74,
	0x75, 0x73, 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,
	0x32, 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, 0x32, 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, 0x32, 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, 0x32,
	0x3a, 0x3a, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_rawDescData = file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_goTypes = []interface{}{
	(ProductBiddingCategoryStatusEnum_ProductBiddingCategoryStatus)(0), // 0: google.ads.googleads.v2.enums.ProductBiddingCategoryStatusEnum.ProductBiddingCategoryStatus
	(*ProductBiddingCategoryStatusEnum)(nil),                           // 1: google.ads.googleads.v2.enums.ProductBiddingCategoryStatusEnum
}
var file_google_ads_googleads_v2_enums_product_bidding_category_status_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_v2_enums_product_bidding_category_status_proto_init() }
func file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_init() {
	if File_google_ads_googleads_v2_enums_product_bidding_category_status_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ProductBiddingCategoryStatusEnum); 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_v2_enums_product_bidding_category_status_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_product_bidding_category_status_proto = out.File
	file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_product_bidding_category_status_proto_depIdxs = nil
}
