// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/mutate_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 mutate errors.
type MutateErrorEnum_MutateError int32

const (
	// Enum unspecified.
	MutateErrorEnum_UNSPECIFIED MutateErrorEnum_MutateError = 0
	// The received error code is not known in this version.
	MutateErrorEnum_UNKNOWN MutateErrorEnum_MutateError = 1
	// Requested resource was not found.
	MutateErrorEnum_RESOURCE_NOT_FOUND MutateErrorEnum_MutateError = 3
	// Cannot mutate the same resource twice in one request.
	MutateErrorEnum_ID_EXISTS_IN_MULTIPLE_MUTATES MutateErrorEnum_MutateError = 7
	// The field's contents don't match another field that represents the same
	// data.
	MutateErrorEnum_INCONSISTENT_FIELD_VALUES MutateErrorEnum_MutateError = 8
	// Mutates are not allowed for the requested resource.
	MutateErrorEnum_MUTATE_NOT_ALLOWED MutateErrorEnum_MutateError = 9
	// The resource isn't in Google Ads. It belongs to another ads system.
	MutateErrorEnum_RESOURCE_NOT_IN_GOOGLE_ADS MutateErrorEnum_MutateError = 10
	// The resource being created already exists.
	MutateErrorEnum_RESOURCE_ALREADY_EXISTS MutateErrorEnum_MutateError = 11
)

var MutateErrorEnum_MutateError_name = map[int32]string{
	0:  "UNSPECIFIED",
	1:  "UNKNOWN",
	3:  "RESOURCE_NOT_FOUND",
	7:  "ID_EXISTS_IN_MULTIPLE_MUTATES",
	8:  "INCONSISTENT_FIELD_VALUES",
	9:  "MUTATE_NOT_ALLOWED",
	10: "RESOURCE_NOT_IN_GOOGLE_ADS",
	11: "RESOURCE_ALREADY_EXISTS",
}

var MutateErrorEnum_MutateError_value = map[string]int32{
	"UNSPECIFIED":                   0,
	"UNKNOWN":                       1,
	"RESOURCE_NOT_FOUND":            3,
	"ID_EXISTS_IN_MULTIPLE_MUTATES": 7,
	"INCONSISTENT_FIELD_VALUES":     8,
	"MUTATE_NOT_ALLOWED":            9,
	"RESOURCE_NOT_IN_GOOGLE_ADS":    10,
	"RESOURCE_ALREADY_EXISTS":       11,
}

func (x MutateErrorEnum_MutateError) String() string {
	return proto.EnumName(MutateErrorEnum_MutateError_name, int32(x))
}

func (MutateErrorEnum_MutateError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_29e86d4daa207c30, []int{0, 0}
}

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

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

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

var xxx_messageInfo_MutateErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.MutateErrorEnum_MutateError", MutateErrorEnum_MutateError_name, MutateErrorEnum_MutateError_value)
	proto.RegisterType((*MutateErrorEnum)(nil), "google.ads.googleads.v3.errors.MutateErrorEnum")
}

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

var fileDescriptor_29e86d4daa207c30 = []byte{
	// 399 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x8e, 0xd3, 0x30,
	0x18, 0x85, 0x49, 0x47, 0x62, 0xc0, 0x5d, 0x8c, 0xe5, 0x05, 0x88, 0x81, 0xa9, 0x44, 0x0f, 0xe0,
	0x08, 0x65, 0x67, 0x56, 0x9e, 0xda, 0xad, 0x2c, 0x5c, 0xbb, 0xaa, 0x93, 0x0e, 0xa0, 0x4a, 0x56,
	0x20, 0x51, 0x54, 0x69, 0x1a, 0x57, 0x71, 0x66, 0x0e, 0xc4, 0x92, 0xa3, 0x70, 0x04, 0x8e, 0x00,
	0x12, 0x67, 0x40, 0x89, 0xa7, 0x51, 0x59, 0x30, 0xab, 0xbc, 0xd8, 0xdf, 0x7b, 0xfe, 0xf5, 0x7e,
	0xf0, 0xae, 0x72, 0xae, 0xba, 0x2d, 0xe3, 0xbc, 0xf0, 0x71, 0x90, 0x9d, 0xba, 0x4f, 0xe2, 0xb2,
	0x69, 0x5c, 0xe3, 0xe3, 0xfd, 0x5d, 0x9b, 0xb7, 0xa5, 0xed, 0xff, 0xf0, 0xa1, 0x71, 0xad, 0x43,
	0x93, 0xc0, 0xe1, 0xbc, 0xf0, 0x78, 0xb0, 0xe0, 0xfb, 0x04, 0x07, 0xcb, 0xe5, 0x9b, 0x63, 0xe4,
	0x61, 0x17, 0xe7, 0x75, 0xed, 0xda, 0xbc, 0xdd, 0xb9, 0xda, 0x07, 0xf7, 0xf4, 0x4f, 0x04, 0x2e,
	0x96, 0x7d, 0x28, 0xef, 0x70, 0x5e, 0xdf, 0xed, 0xa7, 0x3f, 0x23, 0x30, 0x3e, 0x39, 0x43, 0x17,
	0x60, 0x9c, 0x29, 0xb3, 0xe2, 0x33, 0x31, 0x17, 0x9c, 0xc1, 0x27, 0x68, 0x0c, 0xce, 0x33, 0xf5,
	0x41, 0xe9, 0x1b, 0x05, 0x23, 0xf4, 0x02, 0xa0, 0x35, 0x37, 0x3a, 0x5b, 0xcf, 0xb8, 0x55, 0x3a,
	0xb5, 0x73, 0x9d, 0x29, 0x06, 0xcf, 0xd0, 0x5b, 0x70, 0x25, 0x98, 0xe5, 0x1f, 0x85, 0x49, 0x8d,
	0x15, 0xca, 0x2e, 0x33, 0x99, 0x8a, 0x95, 0xe4, 0x76, 0x99, 0xa5, 0x34, 0xe5, 0x06, 0x9e, 0xa3,
	0x2b, 0xf0, 0x4a, 0xa8, 0x99, 0x56, 0x46, 0x98, 0x94, 0xab, 0xd4, 0xce, 0x05, 0x97, 0xcc, 0x6e,
	0xa8, 0xcc, 0xb8, 0x81, 0xcf, 0xba, 0xe4, 0xc0, 0xf6, 0xb9, 0x54, 0x4a, 0x7d, 0xc3, 0x19, 0x7c,
	0x8e, 0x26, 0xe0, 0xf2, 0x9f, 0x17, 0x85, 0xb2, 0x0b, 0xad, 0x17, 0x92, 0x5b, 0xca, 0x0c, 0x04,
	0xe8, 0x35, 0x78, 0x39, 0xdc, 0x53, 0xb9, 0xe6, 0x94, 0x7d, 0x7a, 0x98, 0x03, 0x8e, 0xaf, 0x7f,
	0x47, 0x60, 0xfa, 0xd5, 0xed, 0xf1, 0xe3, 0xad, 0x5d, 0xc3, 0x93, 0x02, 0x56, 0x5d, 0x53, 0xab,
	0xe8, 0x33, 0x7b, 0xf0, 0x54, 0xee, 0x36, 0xaf, 0x2b, 0xec, 0x9a, 0x2a, 0xae, 0xca, 0xba, 0xef,
	0xf1, 0xb8, 0xac, 0xc3, 0xce, 0xff, 0x6f, 0x77, 0xef, 0xc3, 0xe7, 0xdb, 0xe8, 0x6c, 0x41, 0xe9,
	0xf7, 0xd1, 0x64, 0x11, 0xc2, 0x68, 0xe1, 0x71, 0x90, 0x9d, 0xda, 0x24, 0xb8, 0x7f, 0xd2, 0xff,
	0x38, 0x02, 0x5b, 0x5a, 0xf8, 0xed, 0x00, 0x6c, 0x37, 0xc9, 0x36, 0x00, 0xbf, 0x46, 0xd3, 0x70,
	0x4a, 0x08, 0x2d, 0x3c, 0x21, 0x03, 0x42, 0xc8, 0x26, 0x21, 0x24, 0x40, 0x5f, 0x9e, 0xf6, 0xd3,
	0x25, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x09, 0x19, 0x3b, 0x84, 0x58, 0x02, 0x00, 0x00,
}
