// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v1/enums/campaign_draft_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 draft.
type CampaignDraftStatusEnum_CampaignDraftStatus int32

const (
	// The status has not been specified.
	CampaignDraftStatusEnum_UNSPECIFIED CampaignDraftStatusEnum_CampaignDraftStatus = 0
	// Used for return value only. Represents value unknown in this version.
	CampaignDraftStatusEnum_UNKNOWN CampaignDraftStatusEnum_CampaignDraftStatus = 1
	// Initial state of the draft, the advertiser can start adding changes with
	// no effect on serving.
	CampaignDraftStatusEnum_PROPOSED CampaignDraftStatusEnum_CampaignDraftStatus = 2
	// The campaign draft is removed.
	CampaignDraftStatusEnum_REMOVED CampaignDraftStatusEnum_CampaignDraftStatus = 3
	// Advertiser requested to promote draft's changes back into the original
	// campaign. Advertiser can poll the long running operation returned by
	// the promote action to see the status of the promotion.
	CampaignDraftStatusEnum_PROMOTING CampaignDraftStatusEnum_CampaignDraftStatus = 5
	// The process to merge changes in the draft back to the original campaign
	// has completed successfully.
	CampaignDraftStatusEnum_PROMOTED CampaignDraftStatusEnum_CampaignDraftStatus = 4
	// The promotion failed after it was partially applied. Promote cannot be
	// attempted again safely, so the issue must be corrected in the original
	// campaign.
	CampaignDraftStatusEnum_PROMOTE_FAILED CampaignDraftStatusEnum_CampaignDraftStatus = 6
)

var CampaignDraftStatusEnum_CampaignDraftStatus_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "PROPOSED",
	3: "REMOVED",
	5: "PROMOTING",
	4: "PROMOTED",
	6: "PROMOTE_FAILED",
}

var CampaignDraftStatusEnum_CampaignDraftStatus_value = map[string]int32{
	"UNSPECIFIED":    0,
	"UNKNOWN":        1,
	"PROPOSED":       2,
	"REMOVED":        3,
	"PROMOTING":      5,
	"PROMOTED":       4,
	"PROMOTE_FAILED": 6,
}

func (x CampaignDraftStatusEnum_CampaignDraftStatus) String() string {
	return proto.EnumName(CampaignDraftStatusEnum_CampaignDraftStatus_name, int32(x))
}

func (CampaignDraftStatusEnum_CampaignDraftStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_323d91656879a06e, []int{0, 0}
}

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

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

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

var xxx_messageInfo_CampaignDraftStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v1.enums.CampaignDraftStatusEnum_CampaignDraftStatus", CampaignDraftStatusEnum_CampaignDraftStatus_name, CampaignDraftStatusEnum_CampaignDraftStatus_value)
	proto.RegisterType((*CampaignDraftStatusEnum)(nil), "google.ads.googleads.v1.enums.CampaignDraftStatusEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v1/enums/campaign_draft_status.proto", fileDescriptor_323d91656879a06e)
}

var fileDescriptor_323d91656879a06e = []byte{
	// 345 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4e, 0x83, 0x40,
	0x18, 0x15, 0xaa, 0x55, 0xa7, 0xfe, 0x10, 0x5c, 0x68, 0x8c, 0x5d, 0xb4, 0x07, 0x18, 0x42, 0x5c,
	0x39, 0xae, 0x68, 0x99, 0x36, 0x44, 0xcb, 0x90, 0xfe, 0x60, 0x62, 0x48, 0x9a, 0xb1, 0xd4, 0x09,
	0x49, 0x99, 0x21, 0x1d, 0xda, 0xad, 0xf7, 0x70, 0xe9, 0xd2, 0xa3, 0x78, 0x14, 0x13, 0xef, 0x60,
	0x18, 0x68, 0x57, 0xd5, 0x0d, 0x79, 0xcc, 0xfb, 0xc9, 0xf7, 0x1e, 0xb8, 0x63, 0x42, 0xb0, 0xc5,
	0xdc, 0xa2, 0xb1, 0xb4, 0x4a, 0x58, 0xa0, 0xb5, 0x6d, 0xcd, 0xf9, 0x2a, 0x95, 0xd6, 0x8c, 0xa6,
	0x19, 0x4d, 0x18, 0x9f, 0xc6, 0x4b, 0xfa, 0x9a, 0x4f, 0x65, 0x4e, 0xf3, 0x95, 0x84, 0xd9, 0x52,
	0xe4, 0xc2, 0x6c, 0x96, 0x7a, 0x48, 0x63, 0x09, 0xb7, 0x56, 0xb8, 0xb6, 0xa1, 0xb2, 0x5e, 0xdf,
	0x6c, 0x92, 0xb3, 0xc4, 0xa2, 0x9c, 0x8b, 0x9c, 0xe6, 0x89, 0xe0, 0x95, 0xb9, 0xfd, 0xae, 0x81,
	0xcb, 0x6e, 0x15, 0xee, 0x16, 0xd9, 0x23, 0x15, 0x8d, 0xf9, 0x2a, 0x6d, 0xbf, 0x81, 0x8b, 0x1d,
	0x94, 0x79, 0x0e, 0x1a, 0x13, 0x7f, 0x14, 0xe0, 0xae, 0xd7, 0xf3, 0xb0, 0x6b, 0xec, 0x99, 0x0d,
	0x70, 0x38, 0xf1, 0x1f, 0x7c, 0xf2, 0xe4, 0x1b, 0x9a, 0x79, 0x02, 0x8e, 0x82, 0x21, 0x09, 0xc8,
	0x08, 0xbb, 0x86, 0x5e, 0x50, 0x43, 0x3c, 0x20, 0x21, 0x76, 0x8d, 0x9a, 0x79, 0x0a, 0x8e, 0x83,
	0x21, 0x19, 0x90, 0xb1, 0xe7, 0xf7, 0x8d, 0x83, 0x4a, 0x39, 0x20, 0x63, 0xec, 0x1a, 0xfb, 0xa6,
	0x09, 0xce, 0xaa, 0xbf, 0x69, 0xcf, 0xf1, 0x1e, 0xb1, 0x6b, 0xd4, 0x3b, 0x3f, 0x1a, 0x68, 0xcd,
	0x44, 0x0a, 0xff, 0x2d, 0xd8, 0xb9, 0xda, 0x71, 0x64, 0x50, 0x94, 0x0b, 0xb4, 0xe7, 0x4e, 0x65,
	0x65, 0x62, 0x41, 0x39, 0x83, 0x62, 0xc9, 0x2c, 0x36, 0xe7, 0xaa, 0xfa, 0x66, 0xe6, 0x2c, 0x91,
	0x7f, 0xac, 0x7e, 0xaf, 0xbe, 0x1f, 0x7a, 0xad, 0xef, 0x38, 0x9f, 0x7a, 0xb3, 0x5f, 0x46, 0x39,
	0xb1, 0x84, 0x25, 0x2c, 0x50, 0x68, 0xc3, 0x62, 0x2b, 0xf9, 0xb5, 0xe1, 0x23, 0x27, 0x96, 0xd1,
	0x96, 0x8f, 0x42, 0x3b, 0x52, 0xfc, 0xb7, 0xde, 0x2a, 0x1f, 0x11, 0x72, 0x62, 0x89, 0xd0, 0x56,
	0x81, 0x50, 0x68, 0x23, 0xa4, 0x34, 0x2f, 0x75, 0x75, 0xd8, 0xed, 0x6f, 0x00, 0x00, 0x00, 0xff,
	0xff, 0x21, 0xa1, 0x79, 0xfa, 0x0d, 0x02, 0x00, 0x00,
}
