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

package errors // import "google.golang.org/genproto/googleapis/ads/googleads/v1/errors"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import _ "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.ProtoPackageIsVersion2 // please upgrade the proto package

// Enum describing possible list operation errors.
type ListOperationErrorEnum_ListOperationError int32

const (
	// Enum unspecified.
	ListOperationErrorEnum_UNSPECIFIED ListOperationErrorEnum_ListOperationError = 0
	// The received error code is not known in this version.
	ListOperationErrorEnum_UNKNOWN ListOperationErrorEnum_ListOperationError = 1
	// Field required in value is missing.
	ListOperationErrorEnum_REQUIRED_FIELD_MISSING ListOperationErrorEnum_ListOperationError = 7
	// Duplicate or identical value is sent in multiple list operations.
	ListOperationErrorEnum_DUPLICATE_VALUES ListOperationErrorEnum_ListOperationError = 8
)

var ListOperationErrorEnum_ListOperationError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	7: "REQUIRED_FIELD_MISSING",
	8: "DUPLICATE_VALUES",
}
var ListOperationErrorEnum_ListOperationError_value = map[string]int32{
	"UNSPECIFIED":            0,
	"UNKNOWN":                1,
	"REQUIRED_FIELD_MISSING": 7,
	"DUPLICATE_VALUES":       8,
}

func (x ListOperationErrorEnum_ListOperationError) String() string {
	return proto.EnumName(ListOperationErrorEnum_ListOperationError_name, int32(x))
}
func (ListOperationErrorEnum_ListOperationError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_list_operation_error_945cc7d5592a6156, []int{0, 0}
}

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

func (m *ListOperationErrorEnum) Reset()         { *m = ListOperationErrorEnum{} }
func (m *ListOperationErrorEnum) String() string { return proto.CompactTextString(m) }
func (*ListOperationErrorEnum) ProtoMessage()    {}
func (*ListOperationErrorEnum) Descriptor() ([]byte, []int) {
	return fileDescriptor_list_operation_error_945cc7d5592a6156, []int{0}
}
func (m *ListOperationErrorEnum) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListOperationErrorEnum.Unmarshal(m, b)
}
func (m *ListOperationErrorEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListOperationErrorEnum.Marshal(b, m, deterministic)
}
func (dst *ListOperationErrorEnum) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListOperationErrorEnum.Merge(dst, src)
}
func (m *ListOperationErrorEnum) XXX_Size() int {
	return xxx_messageInfo_ListOperationErrorEnum.Size(m)
}
func (m *ListOperationErrorEnum) XXX_DiscardUnknown() {
	xxx_messageInfo_ListOperationErrorEnum.DiscardUnknown(m)
}

var xxx_messageInfo_ListOperationErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterType((*ListOperationErrorEnum)(nil), "google.ads.googleads.v1.errors.ListOperationErrorEnum")
	proto.RegisterEnum("google.ads.googleads.v1.errors.ListOperationErrorEnum_ListOperationError", ListOperationErrorEnum_ListOperationError_name, ListOperationErrorEnum_ListOperationError_value)
}

func init() {
	proto.RegisterFile("google/ads/googleads/v1/errors/list_operation_error.proto", fileDescriptor_list_operation_error_945cc7d5592a6156)
}

var fileDescriptor_list_operation_error_945cc7d5592a6156 = []byte{
	// 326 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
	0x1c, 0xc6, 0xdd, 0x04, 0x27, 0xd9, 0xc1, 0x52, 0x64, 0xc2, 0x90, 0x1d, 0xfa, 0x00, 0x29, 0xc5,
	0x93, 0xf1, 0x94, 0xad, 0xd9, 0x08, 0xd6, 0xae, 0xae, 0xb6, 0x82, 0x14, 0x4a, 0xb5, 0x25, 0x14,
	0xb6, 0xa4, 0x24, 0x75, 0x47, 0x1f, 0xc6, 0xa3, 0x8f, 0xe2, 0xa3, 0x78, 0xf4, 0x09, 0xa4, 0x8d,
	0xed, 0x65, 0xe8, 0xa9, 0x1f, 0xff, 0xfe, 0xbe, 0x2f, 0xdf, 0xff, 0x0f, 0xae, 0x99, 0x10, 0x6c,
	0x5b, 0xd8, 0x59, 0xae, 0x6c, 0x2d, 0x1b, 0xb5, 0x77, 0xec, 0x42, 0x4a, 0x21, 0x95, 0xbd, 0x2d,
	0x55, 0x9d, 0x8a, 0xaa, 0x90, 0x59, 0x5d, 0x0a, 0x9e, 0xb6, 0x53, 0x58, 0x49, 0x51, 0x0b, 0x73,
	0xa6, 0x79, 0x98, 0xe5, 0x0a, 0xf6, 0x56, 0xb8, 0x77, 0xa0, 0xb6, 0x4e, 0x2f, 0xbb, 0xe8, 0xaa,
	0xb4, 0x33, 0xce, 0x45, 0xdd, 0x46, 0x28, 0xed, 0xb6, 0xde, 0xc0, 0xc4, 0x2b, 0x55, 0xbd, 0xee,
	0xa2, 0x49, 0x63, 0x22, 0xfc, 0x75, 0x67, 0xe5, 0xc0, 0x3c, 0xfc, 0x63, 0x9e, 0x81, 0x71, 0xe4,
	0x87, 0x01, 0x59, 0xd0, 0x25, 0x25, 0xae, 0x71, 0x64, 0x8e, 0xc1, 0x28, 0xf2, 0x6f, 0xfd, 0xf5,
	0xa3, 0x6f, 0x0c, 0xcc, 0x29, 0x98, 0x6c, 0xc8, 0x7d, 0x44, 0x37, 0xc4, 0x4d, 0x97, 0x94, 0x78,
	0x6e, 0x7a, 0x47, 0xc3, 0x90, 0xfa, 0x2b, 0x63, 0x64, 0x9e, 0x03, 0xc3, 0x8d, 0x02, 0x8f, 0x2e,
	0xf0, 0x03, 0x49, 0x63, 0xec, 0x45, 0x24, 0x34, 0x4e, 0xe7, 0xdf, 0x03, 0x60, 0xbd, 0x88, 0x1d,
	0xfc, 0x7f, 0x89, 0xf9, 0xc5, 0x61, 0x95, 0xa0, 0xe9, 0x1f, 0x0c, 0x9e, 0xdc, 0x5f, 0x2b, 0x13,
	0xdb, 0x8c, 0x33, 0x28, 0x24, 0xb3, 0x59, 0xc1, 0xdb, 0xed, 0xba, 0x53, 0x56, 0xa5, 0xfa, 0xeb,
	0xb2, 0x37, 0xfa, 0xf3, 0x3e, 0x3c, 0x5e, 0x61, 0xfc, 0x31, 0x9c, 0xad, 0x74, 0x18, 0xce, 0x15,
	0xd4, 0xb2, 0x51, 0xb1, 0x03, 0xdb, 0x27, 0xd5, 0x67, 0x07, 0x24, 0x38, 0x57, 0x49, 0x0f, 0x24,
	0xb1, 0x93, 0x68, 0xe0, 0x6b, 0x68, 0xe9, 0x29, 0x42, 0x38, 0x57, 0x08, 0xf5, 0x08, 0x42, 0xb1,
	0x83, 0x90, 0x86, 0x9e, 0x4f, 0xda, 0x76, 0x57, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x92, 0x06,
	0x57, 0xb9, 0xf6, 0x01, 0x00, 0x00,
}
