// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/campaign_serving_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 serving statuses of a campaign.
type CampaignServingStatusEnum_CampaignServingStatus int32

const (
	// No value has been specified.
	CampaignServingStatusEnum_UNSPECIFIED CampaignServingStatusEnum_CampaignServingStatus = 0
	// The received value is not known in this version.
	//
	// This is a response-only value.
	CampaignServingStatusEnum_UNKNOWN CampaignServingStatusEnum_CampaignServingStatus = 1
	// Serving.
	CampaignServingStatusEnum_SERVING CampaignServingStatusEnum_CampaignServingStatus = 2
	// None.
	CampaignServingStatusEnum_NONE CampaignServingStatusEnum_CampaignServingStatus = 3
	// Ended.
	CampaignServingStatusEnum_ENDED CampaignServingStatusEnum_CampaignServingStatus = 4
	// Pending.
	CampaignServingStatusEnum_PENDING CampaignServingStatusEnum_CampaignServingStatus = 5
	// Suspended.
	CampaignServingStatusEnum_SUSPENDED CampaignServingStatusEnum_CampaignServingStatus = 6
)

var CampaignServingStatusEnum_CampaignServingStatus_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "SERVING",
	3: "NONE",
	4: "ENDED",
	5: "PENDING",
	6: "SUSPENDED",
}

var CampaignServingStatusEnum_CampaignServingStatus_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"SERVING":     2,
	"NONE":        3,
	"ENDED":       4,
	"PENDING":     5,
	"SUSPENDED":   6,
}

func (x CampaignServingStatusEnum_CampaignServingStatus) String() string {
	return proto.EnumName(CampaignServingStatusEnum_CampaignServingStatus_name, int32(x))
}

func (CampaignServingStatusEnum_CampaignServingStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e1dbcad2fedf0161, []int{0, 0}
}

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

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

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

var xxx_messageInfo_CampaignServingStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignServingStatusEnum_CampaignServingStatus", CampaignServingStatusEnum_CampaignServingStatus_name, CampaignServingStatusEnum_CampaignServingStatus_value)
	proto.RegisterType((*CampaignServingStatusEnum)(nil), "google.ads.googleads.v3.enums.CampaignServingStatusEnum")
}

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

var fileDescriptor_e1dbcad2fedf0161 = []byte{
	// 333 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xdd, 0x6a, 0xfa, 0x30,
	0x1c, 0xfd, 0xb7, 0x7e, 0xfc, 0x67, 0x64, 0xac, 0x14, 0x76, 0x31, 0x99, 0x17, 0xfa, 0x00, 0xe9,
	0x45, 0xef, 0xe2, 0x55, 0xb5, 0x99, 0xc8, 0x20, 0x96, 0x05, 0x3b, 0x18, 0x05, 0xc9, 0x6c, 0x09,
	0x05, 0x9b, 0x14, 0x53, 0x7d, 0x8e, 0x3d, 0xc3, 0x2e, 0xf7, 0x28, 0x7b, 0x94, 0xdd, 0xec, 0x15,
	0x46, 0x12, 0xf5, 0xca, 0xed, 0xa6, 0x9c, 0xe6, 0x7c, 0xf0, 0x3b, 0x07, 0x4c, 0xb8, 0x94, 0x7c,
	0x5b, 0x04, 0x2c, 0x57, 0x81, 0x85, 0x1a, 0x1d, 0xc2, 0xa0, 0x10, 0xfb, 0x4a, 0x05, 0x1b, 0x56,
	0xd5, 0xac, 0xe4, 0x62, 0xad, 0x8a, 0xdd, 0xa1, 0x14, 0x7c, 0xad, 0x1a, 0xd6, 0xec, 0x15, 0xac,
	0x77, 0xb2, 0x91, 0xfe, 0xd0, 0x3a, 0x20, 0xcb, 0x15, 0x3c, 0x9b, 0xe1, 0x21, 0x84, 0xc6, 0x3c,
	0xb8, 0x3f, 0x65, 0xd7, 0x65, 0xc0, 0x84, 0x90, 0x0d, 0x6b, 0x4a, 0x29, 0x8e, 0xe6, 0xf1, 0x9b,
	0x03, 0xee, 0x66, 0xc7, 0x78, 0x6a, 0xd3, 0xa9, 0x09, 0xc7, 0x62, 0x5f, 0x8d, 0x15, 0xb8, 0xbd,
	0x48, 0xfa, 0x37, 0xa0, 0xbf, 0x22, 0x34, 0xc1, 0xb3, 0xc5, 0xc3, 0x02, 0xc7, 0xde, 0x3f, 0xbf,
	0x0f, 0xfe, 0xaf, 0xc8, 0x23, 0x59, 0x3e, 0x13, 0xcf, 0xd1, 0x3f, 0x14, 0x3f, 0xa5, 0x0b, 0x32,
	0xf7, 0x5c, 0xff, 0x0a, 0xb4, 0xc9, 0x92, 0x60, 0xaf, 0xe5, 0xf7, 0x40, 0x07, 0x93, 0x18, 0xc7,
	0x5e, 0x5b, 0x2b, 0x12, 0x4c, 0x62, 0xad, 0xe8, 0xf8, 0xd7, 0xa0, 0x47, 0x57, 0x34, 0xb1, 0x5c,
	0x77, 0xfa, 0xed, 0x80, 0xd1, 0x46, 0x56, 0xf0, 0xcf, 0x5a, 0xd3, 0xc1, 0xc5, 0xc3, 0x12, 0x5d,
	0x2a, 0x71, 0x5e, 0xa6, 0x47, 0x33, 0x97, 0x5b, 0x26, 0x38, 0x94, 0x3b, 0x1e, 0xf0, 0x42, 0x98,
	0xca, 0xa7, 0x81, 0xeb, 0x52, 0xfd, 0xb2, 0xf7, 0xc4, 0x7c, 0xdf, 0xdd, 0xd6, 0x3c, 0x8a, 0x3e,
	0xdc, 0xe1, 0xdc, 0x46, 0x45, 0xb9, 0x82, 0x16, 0x6a, 0x94, 0x86, 0x50, 0x2f, 0xa4, 0x3e, 0x4f,
	0x7c, 0x16, 0xe5, 0x2a, 0x3b, 0xf3, 0x59, 0x1a, 0x66, 0x86, 0xff, 0x72, 0x47, 0xf6, 0x11, 0xa1,
	0x28, 0x57, 0x08, 0x9d, 0x15, 0x08, 0xa5, 0x21, 0x42, 0x46, 0xf3, 0xda, 0x35, 0x87, 0x85, 0x3f,
	0x01, 0x00, 0x00, 0xff, 0xff, 0x81, 0x84, 0x76, 0x33, 0x07, 0x02, 0x00, 0x00,
}
