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

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

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"

// 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 distinct errors.
type DistinctErrorEnum_DistinctError int32

const (
	// Enum unspecified.
	DistinctErrorEnum_UNSPECIFIED DistinctErrorEnum_DistinctError = 0
	// The received error code is not known in this version.
	DistinctErrorEnum_UNKNOWN DistinctErrorEnum_DistinctError = 1
	// Duplicate element.
	DistinctErrorEnum_DUPLICATE_ELEMENT DistinctErrorEnum_DistinctError = 2
	// Duplicate type.
	DistinctErrorEnum_DUPLICATE_TYPE DistinctErrorEnum_DistinctError = 3
)

var DistinctErrorEnum_DistinctError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "DUPLICATE_ELEMENT",
	3: "DUPLICATE_TYPE",
}
var DistinctErrorEnum_DistinctError_value = map[string]int32{
	"UNSPECIFIED":       0,
	"UNKNOWN":           1,
	"DUPLICATE_ELEMENT": 2,
	"DUPLICATE_TYPE":    3,
}

func (x DistinctErrorEnum_DistinctError) String() string {
	return proto.EnumName(DistinctErrorEnum_DistinctError_name, int32(x))
}
func (DistinctErrorEnum_DistinctError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_distinct_error_5ad5da077f636ddb, []int{0, 0}
}

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

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

var xxx_messageInfo_DistinctErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterType((*DistinctErrorEnum)(nil), "google.ads.googleads.v0.errors.DistinctErrorEnum")
	proto.RegisterEnum("google.ads.googleads.v0.errors.DistinctErrorEnum_DistinctError", DistinctErrorEnum_DistinctError_name, DistinctErrorEnum_DistinctError_value)
}

func init() {
	proto.RegisterFile("google/ads/googleads/v0/errors/distinct_error.proto", fileDescriptor_distinct_error_5ad5da077f636ddb)
}

var fileDescriptor_distinct_error_5ad5da077f636ddb = []byte{
	// 268 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x32, 0x4e, 0xcf, 0xcf, 0x4f,
	0xcf, 0x49, 0xd5, 0x4f, 0x4c, 0x29, 0xd6, 0x87, 0x30, 0x41, 0xac, 0x32, 0x03, 0xfd, 0xd4, 0xa2,
	0xa2, 0xfc, 0xa2, 0x62, 0xfd, 0x94, 0xcc, 0xe2, 0x92, 0xcc, 0xbc, 0xe4, 0x92, 0x78, 0x30, 0x5f,
	0xaf, 0xa0, 0x28, 0xbf, 0x24, 0x5f, 0x48, 0x0e, 0xa2, 0x52, 0x2f, 0x31, 0xa5, 0x58, 0x0f, 0xae,
	0x49, 0xaf, 0xcc, 0x40, 0x0f, 0xa2, 0x49, 0x29, 0x97, 0x4b, 0xd0, 0x05, 0xaa, 0xcf, 0x15, 0x24,
	0xe2, 0x9a, 0x57, 0x9a, 0xab, 0x14, 0xc1, 0xc5, 0x8b, 0x22, 0x28, 0xc4, 0xcf, 0xc5, 0x1d, 0xea,
	0x17, 0x1c, 0xe0, 0xea, 0xec, 0xe9, 0xe6, 0xe9, 0xea, 0x22, 0xc0, 0x20, 0xc4, 0xcd, 0xc5, 0x1e,
	0xea, 0xe7, 0xed, 0xe7, 0x1f, 0xee, 0x27, 0xc0, 0x28, 0x24, 0xca, 0x25, 0xe8, 0x12, 0x1a, 0xe0,
	0xe3, 0xe9, 0xec, 0x18, 0xe2, 0x1a, 0xef, 0xea, 0xe3, 0xea, 0xeb, 0xea, 0x17, 0x22, 0xc0, 0x24,
	0x24, 0xc4, 0xc5, 0x87, 0x10, 0x0e, 0x89, 0x0c, 0x70, 0x15, 0x60, 0x76, 0x3a, 0xc1, 0xc8, 0xa5,
	0x94, 0x9c, 0x9f, 0xab, 0x87, 0xdf, 0x55, 0x4e, 0x42, 0x28, 0xd6, 0x07, 0x80, 0x7c, 0x12, 0xc0,
	0x18, 0xe5, 0x02, 0xd5, 0x95, 0x9e, 0x9f, 0x93, 0x98, 0x97, 0xae, 0x97, 0x5f, 0x94, 0xae, 0x9f,
	0x9e, 0x9a, 0x07, 0xf6, 0x27, 0x2c, 0x40, 0x0a, 0x32, 0x8b, 0x71, 0x85, 0x8f, 0x35, 0x84, 0x5a,
	0xc4, 0xc4, 0xec, 0xee, 0xe8, 0xb8, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x98, 0x63, 0x4a, 0xb1, 0x1e,
	0x84, 0x09, 0x62, 0x85, 0x19, 0xe8, 0x81, 0xad, 0x2c, 0x3e, 0x05, 0x53, 0x10, 0xe3, 0x98, 0x52,
	0x1c, 0x03, 0x57, 0x10, 0x13, 0x66, 0x10, 0x03, 0x51, 0x90, 0xc4, 0x06, 0xb6, 0xd8, 0x18, 0x10,
	0x00, 0x00, 0xff, 0xff, 0x4a, 0x23, 0x22, 0x57, 0x97, 0x01, 0x00, 0x00,
}
