// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/campaign_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 a CampaignCriterion.
type CampaignCriterionStatusEnum_CampaignCriterionStatus int32

const (
	// No value has been specified.
	CampaignCriterionStatusEnum_UNSPECIFIED CampaignCriterionStatusEnum_CampaignCriterionStatus = 0
	// The received value is not known in this version.
	//
	// This is a response-only value.
	CampaignCriterionStatusEnum_UNKNOWN CampaignCriterionStatusEnum_CampaignCriterionStatus = 1
	// The campaign criterion is enabled.
	CampaignCriterionStatusEnum_ENABLED CampaignCriterionStatusEnum_CampaignCriterionStatus = 2
	// The campaign criterion is paused.
	CampaignCriterionStatusEnum_PAUSED CampaignCriterionStatusEnum_CampaignCriterionStatus = 3
	// The campaign criterion is removed.
	CampaignCriterionStatusEnum_REMOVED CampaignCriterionStatusEnum_CampaignCriterionStatus = 4
)

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

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

func (x CampaignCriterionStatusEnum_CampaignCriterionStatus) String() string {
	return proto.EnumName(CampaignCriterionStatusEnum_CampaignCriterionStatus_name, int32(x))
}

func (CampaignCriterionStatusEnum_CampaignCriterionStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_cb42476aef577b3f, []int{0, 0}
}

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

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

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

var xxx_messageInfo_CampaignCriterionStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignCriterionStatusEnum_CampaignCriterionStatus", CampaignCriterionStatusEnum_CampaignCriterionStatus_name, CampaignCriterionStatusEnum_CampaignCriterionStatus_value)
	proto.RegisterType((*CampaignCriterionStatusEnum)(nil), "google.ads.googleads.v3.enums.CampaignCriterionStatusEnum")
}

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

var fileDescriptor_cb42476aef577b3f = []byte{
	// 318 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xb1, 0x4e, 0xc3, 0x30,
	0x14, 0xa4, 0x29, 0x2a, 0x92, 0x3b, 0x10, 0x65, 0x41, 0x82, 0x76, 0x68, 0x3f, 0xc0, 0x19, 0xb2,
	0x19, 0x31, 0x38, 0x8d, 0xa9, 0x2a, 0x20, 0x8d, 0xa8, 0x1a, 0x24, 0x14, 0x54, 0x99, 0x26, 0xb2,
	0x2c, 0x35, 0x76, 0x14, 0xbb, 0x9d, 0xf8, 0x1a, 0x46, 0x3e, 0x85, 0x4f, 0x61, 0xe3, 0x0f, 0x90,
	0x9d, 0xa6, 0x5b, 0x58, 0xac, 0xf3, 0xbb, 0x77, 0xa7, 0x77, 0x07, 0xee, 0x98, 0x94, 0x6c, 0x57,
	0xf8, 0x34, 0x57, 0x7e, 0x03, 0x0d, 0x3a, 0x04, 0x7e, 0x21, 0xf6, 0xa5, 0xf2, 0xb7, 0xb4, 0xac,
	0x28, 0x67, 0x62, 0xb3, 0xad, 0xb9, 0x2e, 0x6a, 0x2e, 0xc5, 0x46, 0x69, 0xaa, 0xf7, 0x0a, 0x56,
	0xb5, 0xd4, 0xd2, 0x1b, 0x37, 0x1a, 0x48, 0x73, 0x05, 0x4f, 0x72, 0x78, 0x08, 0xa0, 0x95, 0x5f,
	0x8f, 0x5a, 0xf7, 0x8a, 0xfb, 0x54, 0x08, 0xa9, 0xa9, 0xe6, 0x52, 0x1c, 0xc5, 0xd3, 0x0f, 0x70,
	0x33, 0x3b, 0xfa, 0xcf, 0x5a, 0xfb, 0x95, 0x75, 0x27, 0x62, 0x5f, 0x4e, 0xdf, 0xc0, 0x55, 0x07,
	0xed, 0x5d, 0x82, 0xe1, 0x3a, 0x5e, 0x25, 0x64, 0xb6, 0xb8, 0x5f, 0x90, 0xc8, 0x3d, 0xf3, 0x86,
	0xe0, 0x62, 0x1d, 0x3f, 0xc4, 0xcb, 0x97, 0xd8, 0xed, 0x99, 0x0f, 0x89, 0x71, 0xf8, 0x48, 0x22,
	0xd7, 0xf1, 0x00, 0x18, 0x24, 0x78, 0xbd, 0x22, 0x91, 0xdb, 0x37, 0xc4, 0x33, 0x79, 0x5a, 0xa6,
	0x24, 0x72, 0xcf, 0xc3, 0xdf, 0x1e, 0x98, 0x6c, 0x65, 0x09, 0xff, 0x4d, 0x10, 0x8e, 0x3a, 0x4e,
	0x48, 0x4c, 0x82, 0xa4, 0xf7, 0x1a, 0x1e, 0xe5, 0x4c, 0xee, 0xa8, 0x60, 0x50, 0xd6, 0xcc, 0x67,
	0x85, 0xb0, 0xf9, 0xda, 0x3e, 0x2b, 0xae, 0x3a, 0xea, 0xbd, 0xb5, 0xef, 0xa7, 0xd3, 0x9f, 0x63,
	0xfc, 0xe5, 0x8c, 0xe7, 0x8d, 0x15, 0xce, 0x15, 0x6c, 0xa0, 0x41, 0x69, 0x00, 0x4d, 0x1b, 0xea,
	0xbb, 0xe5, 0x33, 0x9c, 0xab, 0xec, 0xc4, 0x67, 0x69, 0x90, 0x59, 0xfe, 0xc7, 0x99, 0x34, 0x43,
	0x84, 0x70, 0xae, 0x10, 0x3a, 0x6d, 0x20, 0x94, 0x06, 0x08, 0xd9, 0x9d, 0xf7, 0x81, 0x3d, 0x2c,
	0xf8, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xc1, 0x5a, 0x6b, 0xa2, 0xf6, 0x01, 0x00, 0x00,
}
