// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/mutate_job_error.proto

package errors

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

// Enum describing possible request errors.
type MutateJobErrorEnum_MutateJobError int32

const (
	// Enum unspecified.
	MutateJobErrorEnum_UNSPECIFIED MutateJobErrorEnum_MutateJobError = 0
	// The received error code is not known in this version.
	MutateJobErrorEnum_UNKNOWN MutateJobErrorEnum_MutateJobError = 1
	// The mutate job cannot add more operations or run after it has started
	// running.
	MutateJobErrorEnum_CANNOT_MODIFY_JOB_AFTER_JOB_STARTS_RUNNING MutateJobErrorEnum_MutateJobError = 2
	// The operations for an AddMutateJobOperations request were empty.
	MutateJobErrorEnum_EMPTY_OPERATIONS MutateJobErrorEnum_MutateJobError = 3
	// The sequence token for an AddMutateJobOperations request was invalid.
	MutateJobErrorEnum_INVALID_SEQUENCE_TOKEN MutateJobErrorEnum_MutateJobError = 4
	// Mutate Job Results can only be retrieved once the job is finished.
	MutateJobErrorEnum_RESULTS_NOT_READY MutateJobErrorEnum_MutateJobError = 5
	// The page size for ListMutateJobResults was invalid.
	MutateJobErrorEnum_INVALID_PAGE_SIZE MutateJobErrorEnum_MutateJobError = 6
)

var MutateJobErrorEnum_MutateJobError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "CANNOT_MODIFY_JOB_AFTER_JOB_STARTS_RUNNING",
	3: "EMPTY_OPERATIONS",
	4: "INVALID_SEQUENCE_TOKEN",
	5: "RESULTS_NOT_READY",
	6: "INVALID_PAGE_SIZE",
}

var MutateJobErrorEnum_MutateJobError_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"CANNOT_MODIFY_JOB_AFTER_JOB_STARTS_RUNNING": 2,
	"EMPTY_OPERATIONS":                           3,
	"INVALID_SEQUENCE_TOKEN":                     4,
	"RESULTS_NOT_READY":                          5,
	"INVALID_PAGE_SIZE":                          6,
}

func (x MutateJobErrorEnum_MutateJobError) String() string {
	return proto.EnumName(MutateJobErrorEnum_MutateJobError_name, int32(x))
}

func (MutateJobErrorEnum_MutateJobError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa41785fa27c2e49, []int{0, 0}
}

// Container for enum describing possible mutate job errors.
type MutateJobErrorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MutateJobErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.MutateJobErrorEnum_MutateJobError", MutateJobErrorEnum_MutateJobError_name, MutateJobErrorEnum_MutateJobError_value)
	proto.RegisterType((*MutateJobErrorEnum)(nil), "google.ads.googleads.v3.errors.MutateJobErrorEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/errors/mutate_job_error.proto", fileDescriptor_fa41785fa27c2e49)
}

var fileDescriptor_fa41785fa27c2e49 = []byte{
	// 398 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x4f, 0x6e, 0xd4, 0x30,
	0x18, 0xc5, 0xc9, 0x14, 0x8a, 0xe4, 0x4a, 0x60, 0xcc, 0x9f, 0x45, 0x85, 0xba, 0x98, 0x25, 0x0b,
	0x67, 0x11, 0xb1, 0x31, 0x2b, 0xcf, 0xc4, 0x13, 0xb9, 0xed, 0x38, 0x21, 0x76, 0x82, 0xa6, 0x8a,
	0x64, 0x65, 0x48, 0x14, 0x0d, 0xea, 0xc4, 0xa3, 0x38, 0xed, 0x81, 0x58, 0x72, 0x08, 0x0e, 0xc0,
	0x9e, 0x4b, 0xb0, 0xe0, 0x0c, 0x28, 0x31, 0x19, 0xa9, 0x0b, 0x58, 0xe5, 0xe9, 0xe9, 0xfd, 0xbe,
	0x2f, 0x7e, 0x1f, 0x78, 0xdf, 0x18, 0xd3, 0xdc, 0xd6, 0x7e, 0x59, 0x59, 0xdf, 0xc9, 0x41, 0xdd,
	0x07, 0x7e, 0xdd, 0x75, 0xa6, 0xb3, 0xfe, 0xfe, 0xae, 0x2f, 0xfb, 0x5a, 0x7f, 0x31, 0x5b, 0x3d,
	0x3a, 0xf8, 0xd0, 0x99, 0xde, 0xa0, 0x0b, 0x97, 0xc5, 0x65, 0x65, 0xf1, 0x11, 0xc3, 0xf7, 0x01,
	0x76, 0xd8, 0xf9, 0xdb, 0x69, 0xec, 0x61, 0xe7, 0x97, 0x6d, 0x6b, 0xfa, 0xb2, 0xdf, 0x99, 0xd6,
	0x3a, 0x7a, 0xfe, 0xd3, 0x03, 0x68, 0x3d, 0x0e, 0xbe, 0x34, 0x5b, 0x36, 0x10, 0xac, 0xbd, 0xdb,
	0xcf, 0xbf, 0x7b, 0xe0, 0xd9, 0x43, 0x1b, 0x3d, 0x07, 0x67, 0x99, 0x90, 0x09, 0x5b, 0xf2, 0x15,
	0x67, 0x21, 0x7c, 0x84, 0xce, 0xc0, 0xd3, 0x4c, 0x5c, 0x89, 0xf8, 0x93, 0x80, 0x1e, 0xc2, 0xe0,
	0xdd, 0x92, 0x0a, 0x11, 0x2b, 0xbd, 0x8e, 0x43, 0xbe, 0xda, 0xe8, 0xcb, 0x78, 0xa1, 0xe9, 0x4a,
	0xb1, 0x74, 0x54, 0x52, 0xd1, 0x54, 0x49, 0x9d, 0x66, 0x42, 0x70, 0x11, 0xc1, 0x19, 0x7a, 0x05,
	0x20, 0x5b, 0x27, 0x6a, 0xa3, 0xe3, 0x84, 0xa5, 0x54, 0xf1, 0x58, 0x48, 0x78, 0x82, 0xce, 0xc1,
	0x1b, 0x2e, 0x72, 0x7a, 0xcd, 0x43, 0x2d, 0xd9, 0xc7, 0x8c, 0x89, 0x25, 0xd3, 0x2a, 0xbe, 0x62,
	0x02, 0x3e, 0x46, 0xaf, 0xc1, 0x8b, 0x94, 0xc9, 0xec, 0x5a, 0x49, 0x3d, 0xac, 0x49, 0x19, 0x0d,
	0x37, 0xf0, 0xc9, 0x60, 0x4f, 0x48, 0x42, 0x23, 0xa6, 0x25, 0xbf, 0x61, 0xf0, 0x74, 0xf1, 0xdb,
	0x03, 0xf3, 0xcf, 0x66, 0x8f, 0xff, 0x5f, 0xce, 0xe2, 0xe5, 0xc3, 0x47, 0x26, 0x43, 0x27, 0x89,
	0x77, 0x13, 0xfe, 0xc5, 0x1a, 0x73, 0x5b, 0xb6, 0x0d, 0x36, 0x5d, 0xe3, 0x37, 0x75, 0x3b, 0x36,
	0x36, 0x9d, 0xe6, 0xb0, 0xb3, 0xff, 0xba, 0xd4, 0x07, 0xf7, 0xf9, 0x3a, 0x3b, 0x89, 0x28, 0xfd,
	0x36, 0xbb, 0x88, 0xdc, 0x30, 0x5a, 0x59, 0xec, 0xe4, 0xa0, 0xf2, 0x00, 0x8f, 0x2b, 0xed, 0x8f,
	0x29, 0x50, 0xd0, 0xca, 0x16, 0xc7, 0x40, 0x91, 0x07, 0x85, 0x0b, 0xfc, 0x9a, 0xcd, 0x9d, 0x4b,
	0x08, 0xad, 0x2c, 0x21, 0xc7, 0x08, 0x21, 0x79, 0x40, 0x88, 0x0b, 0x6d, 0x4f, 0xc7, 0xbf, 0x0b,
	0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x60, 0x66, 0xf4, 0xa3, 0x46, 0x02, 0x00, 0x00,
}
