// 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/change_status_resource_type.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 listing the resource types support by the ChangeStatus resource.
type ChangeStatusResourceTypeEnum_ChangeStatusResourceType int32

const (
	// No value has been specified.
	ChangeStatusResourceTypeEnum_UNSPECIFIED ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 0
	// Used for return value only. Represents an unclassified resource unknown
	// in this version.
	ChangeStatusResourceTypeEnum_UNKNOWN ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 1
	// An AdGroup resource change.
	ChangeStatusResourceTypeEnum_AD_GROUP ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 3
	// An AdGroupAd resource change.
	ChangeStatusResourceTypeEnum_AD_GROUP_AD ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 4
	// An AdGroupCriterion resource change.
	ChangeStatusResourceTypeEnum_AD_GROUP_CRITERION ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 5
	// A Campaign resource change.
	ChangeStatusResourceTypeEnum_CAMPAIGN ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 6
	// A CampaignCriterion resource change.
	ChangeStatusResourceTypeEnum_CAMPAIGN_CRITERION ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 7
	// A Feed resource change.
	ChangeStatusResourceTypeEnum_FEED ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 9
	// A FeedItem resource change.
	ChangeStatusResourceTypeEnum_FEED_ITEM ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 10
	// An AdGroupFeed resource change.
	ChangeStatusResourceTypeEnum_AD_GROUP_FEED ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 11
	// A CampaignFeed resource change.
	ChangeStatusResourceTypeEnum_CAMPAIGN_FEED ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 12
	// An AdGroupBidModifier resource change.
	ChangeStatusResourceTypeEnum_AD_GROUP_BID_MODIFIER ChangeStatusResourceTypeEnum_ChangeStatusResourceType = 13
)

// Enum value maps for ChangeStatusResourceTypeEnum_ChangeStatusResourceType.
var (
	ChangeStatusResourceTypeEnum_ChangeStatusResourceType_name = map[int32]string{
		0:  "UNSPECIFIED",
		1:  "UNKNOWN",
		3:  "AD_GROUP",
		4:  "AD_GROUP_AD",
		5:  "AD_GROUP_CRITERION",
		6:  "CAMPAIGN",
		7:  "CAMPAIGN_CRITERION",
		9:  "FEED",
		10: "FEED_ITEM",
		11: "AD_GROUP_FEED",
		12: "CAMPAIGN_FEED",
		13: "AD_GROUP_BID_MODIFIER",
	}
	ChangeStatusResourceTypeEnum_ChangeStatusResourceType_value = map[string]int32{
		"UNSPECIFIED":           0,
		"UNKNOWN":               1,
		"AD_GROUP":              3,
		"AD_GROUP_AD":           4,
		"AD_GROUP_CRITERION":    5,
		"CAMPAIGN":              6,
		"CAMPAIGN_CRITERION":    7,
		"FEED":                  9,
		"FEED_ITEM":             10,
		"AD_GROUP_FEED":         11,
		"CAMPAIGN_FEED":         12,
		"AD_GROUP_BID_MODIFIER": 13,
	}
)

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

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

func (ChangeStatusResourceTypeEnum_ChangeStatusResourceType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_change_status_resource_type_proto_enumTypes[0].Descriptor()
}

func (ChangeStatusResourceTypeEnum_ChangeStatusResourceType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_change_status_resource_type_proto_enumTypes[0]
}

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

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

// Container for enum describing supported resource types for the ChangeStatus
// resource.
type ChangeStatusResourceTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*ChangeStatusResourceTypeEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v1_enums_change_status_resource_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_change_status_resource_type_proto_rawDesc = []byte{
	0x0a, 0x3f, 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, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x72, 0x65,
	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 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, 0x90,
	0x02, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
	0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22,
	0xef, 0x01, 0x0a, 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 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, 0x0c, 0x0a, 0x08, 0x41, 0x44,
	0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x44, 0x5f, 0x47,
	0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x44, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x5f,
	0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x52, 0x49, 0x54, 0x45, 0x52, 0x49, 0x4f, 0x4e, 0x10,
	0x05, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x41, 0x4d, 0x50, 0x41, 0x49, 0x47, 0x4e, 0x10, 0x06, 0x12,
	0x16, 0x0a, 0x12, 0x43, 0x41, 0x4d, 0x50, 0x41, 0x49, 0x47, 0x4e, 0x5f, 0x43, 0x52, 0x49, 0x54,
	0x45, 0x52, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x45, 0x45, 0x44, 0x10,
	0x09, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x45, 0x45, 0x44, 0x5f, 0x49, 0x54, 0x45, 0x4d, 0x10, 0x0a,
	0x12, 0x11, 0x0a, 0x0d, 0x41, 0x44, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x46, 0x45, 0x45,
	0x44, 0x10, 0x0b, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x41, 0x4d, 0x50, 0x41, 0x49, 0x47, 0x4e, 0x5f,
	0x46, 0x45, 0x45, 0x44, 0x10, 0x0c, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x44, 0x5f, 0x47, 0x52, 0x4f,
	0x55, 0x50, 0x5f, 0x42, 0x49, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x49, 0x46, 0x49, 0x45, 0x52, 0x10,
	0x0d, 0x42, 0xf2, 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, 0x1d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53,
	0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70,
	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_change_status_resource_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_change_status_resource_type_proto_rawDescData = file_google_ads_googleads_v1_enums_change_status_resource_type_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_change_status_resource_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_change_status_resource_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_change_status_resource_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_change_status_resource_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_change_status_resource_type_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_change_status_resource_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_change_status_resource_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_change_status_resource_type_proto_goTypes = []interface{}{
	(ChangeStatusResourceTypeEnum_ChangeStatusResourceType)(0), // 0: google.ads.googleads.v1.enums.ChangeStatusResourceTypeEnum.ChangeStatusResourceType
	(*ChangeStatusResourceTypeEnum)(nil),                       // 1: google.ads.googleads.v1.enums.ChangeStatusResourceTypeEnum
}
var file_google_ads_googleads_v1_enums_change_status_resource_type_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_change_status_resource_type_proto_init() }
func file_google_ads_googleads_v1_enums_change_status_resource_type_proto_init() {
	if File_google_ads_googleads_v1_enums_change_status_resource_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_change_status_resource_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChangeStatusResourceTypeEnum); 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_change_status_resource_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_change_status_resource_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_change_status_resource_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_change_status_resource_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_change_status_resource_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_change_status_resource_type_proto = out.File
	file_google_ads_googleads_v1_enums_change_status_resource_type_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_change_status_resource_type_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_change_status_resource_type_proto_depIdxs = nil
}
