// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/ad_group_criterion_status.proto

package enums

import (
	fmt "fmt"
	math "math"

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

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// The possible statuses of an AdGroupCriterion.
type AdGroupCriterionStatusEnum_AdGroupCriterionStatus int32

const (
	// No value has been specified.
	AdGroupCriterionStatusEnum_UNSPECIFIED AdGroupCriterionStatusEnum_AdGroupCriterionStatus = 0
	// The received value is not known in this version.
	//
	// This is a response-only value.
	AdGroupCriterionStatusEnum_UNKNOWN AdGroupCriterionStatusEnum_AdGroupCriterionStatus = 1
	// The ad group criterion is enabled.
	AdGroupCriterionStatusEnum_ENABLED AdGroupCriterionStatusEnum_AdGroupCriterionStatus = 2
	// The ad group criterion is paused.
	AdGroupCriterionStatusEnum_PAUSED AdGroupCriterionStatusEnum_AdGroupCriterionStatus = 3
	// The ad group criterion is removed.
	AdGroupCriterionStatusEnum_REMOVED AdGroupCriterionStatusEnum_AdGroupCriterionStatus = 4
)

var AdGroupCriterionStatusEnum_AdGroupCriterionStatus_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "ENABLED",
	3: "PAUSED",
	4: "REMOVED",
}

var AdGroupCriterionStatusEnum_AdGroupCriterionStatus_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"ENABLED":     2,
	"PAUSED":      3,
	"REMOVED":     4,
}

func (x AdGroupCriterionStatusEnum_AdGroupCriterionStatus) String() string {
	return proto.EnumName(AdGroupCriterionStatusEnum_AdGroupCriterionStatus_name, int32(x))
}

func (AdGroupCriterionStatusEnum_AdGroupCriterionStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_319f05083d11848f, []int{0, 0}
}

// Message describing AdGroupCriterion statuses.
type AdGroupCriterionStatusEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AdGroupCriterionStatusEnum) Reset()         { *m = AdGroupCriterionStatusEnum{} }
func (m *AdGroupCriterionStatusEnum) String() string { return proto.CompactTextString(m) }
func (*AdGroupCriterionStatusEnum) ProtoMessage()    {}
func (*AdGroupCriterionStatusEnum) Descriptor() ([]byte, []int) {
	return fileDescriptor_319f05083d11848f, []int{0}
}

func (m *AdGroupCriterionStatusEnum) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AdGroupCriterionStatusEnum.Unmarshal(m, b)
}
func (m *AdGroupCriterionStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AdGroupCriterionStatusEnum.Marshal(b, m, deterministic)
}
func (m *AdGroupCriterionStatusEnum) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AdGroupCriterionStatusEnum.Merge(m, src)
}
func (m *AdGroupCriterionStatusEnum) XXX_Size() int {
	return xxx_messageInfo_AdGroupCriterionStatusEnum.Size(m)
}
func (m *AdGroupCriterionStatusEnum) XXX_DiscardUnknown() {
	xxx_messageInfo_AdGroupCriterionStatusEnum.DiscardUnknown(m)
}

var xxx_messageInfo_AdGroupCriterionStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.AdGroupCriterionStatusEnum_AdGroupCriterionStatus", AdGroupCriterionStatusEnum_AdGroupCriterionStatus_name, AdGroupCriterionStatusEnum_AdGroupCriterionStatus_value)
	proto.RegisterType((*AdGroupCriterionStatusEnum)(nil), "google.ads.googleads.v3.enums.AdGroupCriterionStatusEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/enums/ad_group_criterion_status.proto", fileDescriptor_319f05083d11848f)
}

var fileDescriptor_319f05083d11848f = []byte{
	// 320 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x31, 0x4e, 0xc3, 0x30,
	0x18, 0x85, 0x69, 0x8a, 0x8a, 0xe4, 0x0e, 0x44, 0x19, 0x18, 0x0a, 0x1d, 0xda, 0x03, 0x38, 0x43,
	0x36, 0x23, 0x06, 0xa7, 0x31, 0x55, 0x05, 0xa4, 0x11, 0x55, 0x83, 0x84, 0x22, 0x55, 0xa6, 0x8e,
	0xac, 0x48, 0xad, 0x1d, 0xc5, 0x4e, 0x07, 0x8e, 0xc3, 0xc8, 0x51, 0x38, 0x0a, 0x13, 0x47, 0x40,
	0x76, 0x9a, 0x4c, 0x85, 0xc5, 0x7a, 0xf6, 0xfb, 0xdf, 0xa7, 0xe7, 0x1f, 0xdc, 0x71, 0x29, 0xf9,
	0x2e, 0xf7, 0x29, 0x53, 0x7e, 0x23, 0x8d, 0x3a, 0x04, 0x7e, 0x2e, 0xea, 0xbd, 0xf2, 0x29, 0xdb,
	0xf0, 0x4a, 0xd6, 0xe5, 0x66, 0x5b, 0x15, 0x3a, 0xaf, 0x0a, 0x29, 0x36, 0x4a, 0x53, 0x5d, 0x2b,
	0x58, 0x56, 0x52, 0x4b, 0x6f, 0xdc, 0x64, 0x20, 0x65, 0x0a, 0x76, 0x71, 0x78, 0x08, 0xa0, 0x8d,
	0x8f, 0x6e, 0x5a, 0x7a, 0x59, 0xf8, 0x54, 0x08, 0xa9, 0xa9, 0x2e, 0xa4, 0x38, 0x86, 0xa7, 0xef,
	0x60, 0x84, 0xd9, 0xdc, 0xe0, 0x67, 0x2d, 0x7d, 0x65, 0xe1, 0x44, 0xd4, 0xfb, 0x69, 0x06, 0xae,
	0x4e, 0xbb, 0xde, 0x25, 0x18, 0xae, 0xe3, 0x55, 0x42, 0x66, 0x8b, 0xfb, 0x05, 0x89, 0xdc, 0x33,
	0x6f, 0x08, 0x2e, 0xd6, 0xf1, 0x43, 0xbc, 0x7c, 0x89, 0xdd, 0x9e, 0xb9, 0x90, 0x18, 0x87, 0x8f,
	0x24, 0x72, 0x1d, 0x0f, 0x80, 0x41, 0x82, 0xd7, 0x2b, 0x12, 0xb9, 0x7d, 0x63, 0x3c, 0x93, 0xa7,
	0x65, 0x4a, 0x22, 0xf7, 0x3c, 0xfc, 0xe9, 0x81, 0xc9, 0x56, 0xee, 0xe1, 0xbf, 0xfd, 0xc3, 0xeb,
	0xd3, 0x0d, 0x12, 0x53, 0x3f, 0xe9, 0xbd, 0x86, 0xc7, 0x34, 0x97, 0x3b, 0x2a, 0x38, 0x94, 0x15,
	0xf7, 0x79, 0x2e, 0xec, 0xe7, 0xda, 0x65, 0x96, 0x85, 0xfa, 0x63, 0xb7, 0xb7, 0xf6, 0xfc, 0x70,
	0xfa, 0x73, 0x8c, 0x3f, 0x9d, 0xf1, 0xbc, 0x41, 0x61, 0xa6, 0x60, 0x23, 0x8d, 0x4a, 0x03, 0x68,
	0x76, 0xa1, 0xbe, 0x5a, 0x3f, 0xc3, 0x4c, 0x65, 0x9d, 0x9f, 0xa5, 0x41, 0x66, 0xfd, 0x6f, 0x67,
	0xd2, 0x3c, 0x22, 0x84, 0x99, 0x42, 0xa8, 0x9b, 0x40, 0x28, 0x0d, 0x10, 0xb2, 0x33, 0x6f, 0x03,
	0x5b, 0x2c, 0xf8, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x5d, 0x0e, 0xf9, 0x4a, 0xf3, 0x01, 0x00, 0x00,
}
