// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/ads/googleads/v1/enums/campaign_draft_status.proto

package enums

import (
	reflect "reflect"
	sync "sync"

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

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// 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
)

// Enum value maps for CampaignDraftStatusEnum_CampaignDraftStatus.
var (
	CampaignDraftStatusEnum_CampaignDraftStatus_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "PROPOSED",
		3: "REMOVED",
		5: "PROMOTING",
		4: "PROMOTED",
		6: "PROMOTE_FAILED",
	}
	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) Enum() *CampaignDraftStatusEnum_CampaignDraftStatus {
	p := new(CampaignDraftStatusEnum_CampaignDraftStatus)
	*p = x
	return p
}

func (x CampaignDraftStatusEnum_CampaignDraftStatus) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (CampaignDraftStatusEnum_CampaignDraftStatus) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_campaign_draft_status_proto_enumTypes[0].Descriptor()
}

func (CampaignDraftStatusEnum_CampaignDraftStatus) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_campaign_draft_status_proto_enumTypes[0]
}

func (x CampaignDraftStatusEnum_CampaignDraftStatus) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use CampaignDraftStatusEnum_CampaignDraftStatus.Descriptor instead.
func (CampaignDraftStatusEnum_CampaignDraftStatus) EnumDescriptor() ([]byte, []int) {
	return file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDescGZIP(), []int{0, 0}
}

// Container for enum describing possible statuses of a campaign draft.
type CampaignDraftStatusEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *CampaignDraftStatusEnum) Reset() {
	*x = CampaignDraftStatusEnum{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_googleads_v1_enums_campaign_draft_status_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *CampaignDraftStatusEnum) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CampaignDraftStatusEnum) ProtoMessage() {}

func (x *CampaignDraftStatusEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v1_enums_campaign_draft_status_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CampaignDraftStatusEnum.ProtoReflect.Descriptor instead.
func (*CampaignDraftStatusEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v1_enums_campaign_draft_status_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDesc = []byte{
	0x0a, 0x39, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x63, 0x61, 0x6d, 0x70, 0x61, 0x69, 0x67, 0x6e, 0x5f, 0x64, 0x72, 0x61, 0x66, 0x74, 0x5f, 0x73,
	0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64,
	0x73, 0x2e, 0x76, 0x31, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9a, 0x01, 0x0a, 0x17, 0x43, 0x61, 0x6d,
	0x70, 0x61, 0x69, 0x67, 0x6e, 0x44, 0x72, 0x61, 0x66, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x45, 0x6e, 0x75, 0x6d, 0x22, 0x7f, 0x0a, 0x13, 0x43, 0x61, 0x6d, 0x70, 0x61, 0x69, 0x67, 0x6e,
	0x44, 0x72, 0x61, 0x66, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x55,
	0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07,
	0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x52, 0x4f,
	0x50, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x4d, 0x4f, 0x56,
	0x45, 0x44, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x4f, 0x4d, 0x4f, 0x54, 0x49, 0x4e,
	0x47, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x52, 0x4f, 0x4d, 0x4f, 0x54, 0x45, 0x44, 0x10,
	0x04, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x52, 0x4f, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49,
	0x4c, 0x45, 0x44, 0x10, 0x06, 0x42, 0xed, 0x01, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,
	0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x18, 0x43, 0x61, 0x6d,
	0x70, 0x61, 0x69, 0x67, 0x6e, 0x44, 0x72, 0x61, 0x66, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61,
	0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f,
	0x65, 0x6e, 0x75, 0x6d, 0x73, 0x3b, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0xa2, 0x02, 0x03, 0x47, 0x41,
	0x41, 0xaa, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x41, 0x64, 0x73, 0x2e, 0x47,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x2e, 0x56, 0x31, 0x2e, 0x45, 0x6e, 0x75, 0x6d,
	0x73, 0xca, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x41, 0x64, 0x73, 0x5c, 0x47,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x5c, 0x56, 0x31, 0x5c, 0x45, 0x6e, 0x75, 0x6d,
	0x73, 0xea, 0x02, 0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x41, 0x64, 0x73, 0x3a,
	0x3a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x56, 0x31, 0x3a, 0x3a,
	0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDescData = file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_campaign_draft_status_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_campaign_draft_status_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_campaign_draft_status_proto_goTypes = []interface{}{
	(CampaignDraftStatusEnum_CampaignDraftStatus)(0), // 0: google.ads.googleads.v1.enums.CampaignDraftStatusEnum.CampaignDraftStatus
	(*CampaignDraftStatusEnum)(nil),                  // 1: google.ads.googleads.v1.enums.CampaignDraftStatusEnum
}
var file_google_ads_googleads_v1_enums_campaign_draft_status_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_google_ads_googleads_v1_enums_campaign_draft_status_proto_init() }
func file_google_ads_googleads_v1_enums_campaign_draft_status_proto_init() {
	if File_google_ads_googleads_v1_enums_campaign_draft_status_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_campaign_draft_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CampaignDraftStatusEnum); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_campaign_draft_status_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_campaign_draft_status_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_campaign_draft_status_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_campaign_draft_status_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_campaign_draft_status_proto = out.File
	file_google_ads_googleads_v1_enums_campaign_draft_status_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_campaign_draft_status_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_campaign_draft_status_proto_depIdxs = nil
}
