// 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/ad_group_criterion_approval_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

// Enumerates AdGroupCriterion approval statuses.
type AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus int32

const (
	// Not specified.
	AdGroupCriterionApprovalStatusEnum_UNSPECIFIED AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus = 0
	// The value is unknown in this version.
	AdGroupCriterionApprovalStatusEnum_UNKNOWN AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus = 1
	// Approved.
	AdGroupCriterionApprovalStatusEnum_APPROVED AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus = 2
	// Disapproved.
	AdGroupCriterionApprovalStatusEnum_DISAPPROVED AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus = 3
	// Pending Review.
	AdGroupCriterionApprovalStatusEnum_PENDING_REVIEW AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus = 4
	// Under review.
	AdGroupCriterionApprovalStatusEnum_UNDER_REVIEW AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus = 5
)

// Enum value maps for AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus.
var (
	AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "APPROVED",
		3: "DISAPPROVED",
		4: "PENDING_REVIEW",
		5: "UNDER_REVIEW",
	}
	AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus_value = map[string]int32{
		"UNSPECIFIED":    0,
		"UNKNOWN":        1,
		"APPROVED":       2,
		"DISAPPROVED":    3,
		"PENDING_REVIEW": 4,
		"UNDER_REVIEW":   5,
	}
)

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

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

func (AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_enumTypes[0].Descriptor()
}

func (AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_enumTypes[0]
}

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

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

// Container for enum describing possible AdGroupCriterion approval statuses.
type AdGroupCriterionApprovalStatusEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*AdGroupCriterionApprovalStatusEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_rawDesc = []byte{
	0x0a, 0x46, 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,
	0x61, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69,
	0x6f, 0x6e, 0x5f, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 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,
	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, 0xaa, 0x01, 0x0a, 0x22, 0x41, 0x64, 0x47, 0x72, 0x6f, 0x75,
	0x70, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76,
	0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x83, 0x01, 0x0a,
	0x1e, 0x41, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x6f,
	0x6e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 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, 0x0c, 0x0a,
	0x08, 0x41, 0x50, 0x50, 0x52, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x44,
	0x49, 0x53, 0x41, 0x50, 0x50, 0x52, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e,
	0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x56, 0x49, 0x45, 0x57, 0x10, 0x04,
	0x12, 0x10, 0x0a, 0x0c, 0x55, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x56, 0x49, 0x45, 0x57,
	0x10, 0x05, 0x42, 0xf8, 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, 0x23, 0x41, 0x64, 0x47, 0x72, 0x6f, 0x75,
	0x70, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76,
	0x61, 0x6c, 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, 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_ad_group_criterion_approval_status_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_rawDescData = file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_goTypes = []interface{}{
	(AdGroupCriterionApprovalStatusEnum_AdGroupCriterionApprovalStatus)(0), // 0: google.ads.googleads.v1.enums.AdGroupCriterionApprovalStatusEnum.AdGroupCriterionApprovalStatus
	(*AdGroupCriterionApprovalStatusEnum)(nil),                             // 1: google.ads.googleads.v1.enums.AdGroupCriterionApprovalStatusEnum
}
var file_google_ads_googleads_v1_enums_ad_group_criterion_approval_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_v1_enums_ad_group_criterion_approval_status_proto_init() }
func file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_init() {
	if File_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AdGroupCriterionApprovalStatusEnum); 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_ad_group_criterion_approval_status_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto = out.File
	file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_ad_group_criterion_approval_status_proto_depIdxs = nil
}
