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

// Possible statuses of a campaign.
type CampaignStatusEnum_CampaignStatus int32

const (
	// Not specified.
	CampaignStatusEnum_UNSPECIFIED CampaignStatusEnum_CampaignStatus = 0
	// Used for return value only. Represents value unknown in this version.
	CampaignStatusEnum_UNKNOWN CampaignStatusEnum_CampaignStatus = 1
	// Campaign is currently serving ads depending on budget information.
	CampaignStatusEnum_ENABLED CampaignStatusEnum_CampaignStatus = 2
	// Campaign has been paused by the user.
	CampaignStatusEnum_PAUSED CampaignStatusEnum_CampaignStatus = 3
	// Campaign has been removed.
	CampaignStatusEnum_REMOVED CampaignStatusEnum_CampaignStatus = 4
)

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

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

func (x CampaignStatusEnum_CampaignStatus) String() string {
	return proto.EnumName(CampaignStatusEnum_CampaignStatus_name, int32(x))
}

func (CampaignStatusEnum_CampaignStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d65eafe20466bcae, []int{0, 0}
}

// Container for enum describing possible statuses of a campaign.
type CampaignStatusEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CampaignStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignStatusEnum_CampaignStatus", CampaignStatusEnum_CampaignStatus_name, CampaignStatusEnum_CampaignStatus_value)
	proto.RegisterType((*CampaignStatusEnum)(nil), "google.ads.googleads.v3.enums.CampaignStatusEnum")
}

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

var fileDescriptor_d65eafe20466bcae = []byte{
	// 305 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
	0x18, 0x77, 0x9d, 0x4c, 0xc8, 0x40, 0x4b, 0xbd, 0x89, 0x3b, 0x6c, 0x0f, 0x90, 0x1c, 0x72, 0x8b,
	0xa7, 0x74, 0x8d, 0x63, 0xa8, 0x5d, 0x71, 0xae, 0x82, 0x14, 0x24, 0xae, 0x25, 0x54, 0xd6, 0xa4,
	0x2c, 0xed, 0x1e, 0xc8, 0xa3, 0x8f, 0xe2, 0x93, 0x88, 0x4f, 0x21, 0x49, 0xff, 0xc0, 0x0e, 0x7a,
	0x29, 0xbf, 0x7e, 0xbf, 0x3f, 0xf9, 0x7d, 0x1f, 0xc0, 0x42, 0x29, 0xb1, 0xcb, 0x10, 0x4f, 0x35,
	0x6a, 0xa0, 0x41, 0x07, 0x8c, 0x32, 0x59, 0x17, 0x1a, 0x6d, 0x79, 0x51, 0xf2, 0x5c, 0xc8, 0x57,
	0x5d, 0xf1, 0xaa, 0xd6, 0xb0, 0xdc, 0xab, 0x4a, 0x79, 0x93, 0x46, 0x09, 0x79, 0xaa, 0x61, 0x6f,
	0x82, 0x07, 0x0c, 0xad, 0xe9, 0xea, 0xba, 0xcb, 0x2c, 0x73, 0xc4, 0xa5, 0x54, 0x15, 0xaf, 0x72,
	0x25, 0x5b, 0xf3, 0xec, 0x1d, 0x78, 0xf3, 0x36, 0x75, 0x6d, 0x43, 0x99, 0xac, 0x8b, 0xd9, 0x13,
	0x38, 0x3f, 0x9e, 0x7a, 0x17, 0x60, 0xbc, 0x09, 0xd7, 0x11, 0x9b, 0x2f, 0x6f, 0x97, 0x2c, 0x70,
	0x4f, 0xbc, 0x31, 0x38, 0xdb, 0x84, 0x77, 0xe1, 0xea, 0x39, 0x74, 0x07, 0xe6, 0x87, 0x85, 0xd4,
	0xbf, 0x67, 0x81, 0xeb, 0x78, 0x00, 0x8c, 0x22, 0xba, 0x59, 0xb3, 0xc0, 0x1d, 0x1a, 0xe2, 0x91,
	0x3d, 0xac, 0x62, 0x16, 0xb8, 0xa7, 0xfe, 0xf7, 0x00, 0x4c, 0xb7, 0xaa, 0x80, 0xff, 0xf6, 0xf5,
	0x2f, 0x8f, 0x5f, 0x8e, 0x4c, 0xcd, 0x68, 0xf0, 0xe2, 0xb7, 0x2e, 0xa1, 0x76, 0x5c, 0x0a, 0xa8,
	0xf6, 0x02, 0x89, 0x4c, 0xda, 0x25, 0xba, 0x53, 0x95, 0xb9, 0xfe, 0xe3, 0x72, 0x37, 0xf6, 0xfb,
	0xe1, 0x0c, 0x17, 0x94, 0x7e, 0x3a, 0x93, 0x45, 0x13, 0x45, 0x53, 0x0d, 0x1b, 0x68, 0x50, 0x8c,
	0xa1, 0xd9, 0x5d, 0x7f, 0x75, 0x7c, 0x42, 0x53, 0x9d, 0xf4, 0x7c, 0x12, 0xe3, 0xc4, 0xf2, 0x3f,
	0xce, 0xb4, 0x19, 0x12, 0x42, 0x53, 0x4d, 0x48, 0xaf, 0x20, 0x24, 0xc6, 0x84, 0x58, 0xcd, 0xdb,
	0xc8, 0x16, 0xc3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x40, 0xc4, 0x78, 0x9f, 0xd1, 0x01, 0x00,
	0x00,
}
