// 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/v3/enums/mutate_job_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

// The mutate job statuses.
type MutateJobStatusEnum_MutateJobStatus int32

const (
	// Not specified.
	MutateJobStatusEnum_UNSPECIFIED MutateJobStatusEnum_MutateJobStatus = 0
	// Used for return value only. Represents value unknown in this version.
	MutateJobStatusEnum_UNKNOWN MutateJobStatusEnum_MutateJobStatus = 1
	// The job is not currently running.
	MutateJobStatusEnum_PENDING MutateJobStatusEnum_MutateJobStatus = 2
	// The job is running.
	MutateJobStatusEnum_RUNNING MutateJobStatusEnum_MutateJobStatus = 3
	// The job is done.
	MutateJobStatusEnum_DONE MutateJobStatusEnum_MutateJobStatus = 4
)

// Enum value maps for MutateJobStatusEnum_MutateJobStatus.
var (
	MutateJobStatusEnum_MutateJobStatus_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "PENDING",
		3: "RUNNING",
		4: "DONE",
	}
	MutateJobStatusEnum_MutateJobStatus_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"PENDING":     2,
		"RUNNING":     3,
		"DONE":        4,
	}
)

func (x MutateJobStatusEnum_MutateJobStatus) Enum() *MutateJobStatusEnum_MutateJobStatus {
	p := new(MutateJobStatusEnum_MutateJobStatus)
	*p = x
	return p
}

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

func (MutateJobStatusEnum_MutateJobStatus) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_mutate_job_status_proto_enumTypes[0].Descriptor()
}

func (MutateJobStatusEnum_MutateJobStatus) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_mutate_job_status_proto_enumTypes[0]
}

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

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

// Container for enum describing possible mutate job statuses.
type MutateJobStatusEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*MutateJobStatusEnum) ProtoMessage() {}

func (x *MutateJobStatusEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v3_enums_mutate_job_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 MutateJobStatusEnum.ProtoReflect.Descriptor instead.
func (*MutateJobStatusEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v3_enums_mutate_job_status_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v3_enums_mutate_job_status_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_mutate_job_status_proto_rawDesc = []byte{
	0x0a, 0x35, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x6d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6a, 0x6f, 0x62, 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, 0x33,
	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, 0x6a, 0x0a, 0x13, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x6f,
	0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x53, 0x0a, 0x0f, 0x4d,
	0x75, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 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, 0x0b, 0x0a, 0x07,
	0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e,
	0x4e, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x04,
	0x42, 0xe9, 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, 0x33,
	0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x14, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x6f,
	0x62, 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, 0x33, 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, 0x33, 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, 0x33, 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, 0x33, 0x3a, 0x3a, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v3_enums_mutate_job_status_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_mutate_job_status_proto_rawDescData = file_google_ads_googleads_v3_enums_mutate_job_status_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_mutate_job_status_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_mutate_job_status_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_mutate_job_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_mutate_job_status_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_mutate_job_status_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_mutate_job_status_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_mutate_job_status_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_mutate_job_status_proto_goTypes = []interface{}{
	(MutateJobStatusEnum_MutateJobStatus)(0), // 0: google.ads.googleads.v3.enums.MutateJobStatusEnum.MutateJobStatus
	(*MutateJobStatusEnum)(nil),              // 1: google.ads.googleads.v3.enums.MutateJobStatusEnum
}
var file_google_ads_googleads_v3_enums_mutate_job_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_v3_enums_mutate_job_status_proto_init() }
func file_google_ads_googleads_v3_enums_mutate_job_status_proto_init() {
	if File_google_ads_googleads_v3_enums_mutate_job_status_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_mutate_job_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MutateJobStatusEnum); 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_v3_enums_mutate_job_status_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_mutate_job_status_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_mutate_job_status_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_mutate_job_status_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_mutate_job_status_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_mutate_job_status_proto = out.File
	file_google_ads_googleads_v3_enums_mutate_job_status_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_mutate_job_status_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_mutate_job_status_proto_depIdxs = nil
}
