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

const (
	// Enum unspecified.
	SizeLimitErrorEnum_UNSPECIFIED SizeLimitErrorEnum_SizeLimitError = 0
	// The received error code is not known in this version.
	SizeLimitErrorEnum_UNKNOWN SizeLimitErrorEnum_SizeLimitError = 1
	// The number of entries in the request exceeds the system limit.
	SizeLimitErrorEnum_REQUEST_SIZE_LIMIT_EXCEEDED SizeLimitErrorEnum_SizeLimitError = 2
	// The number of entries in the response exceeds the system limit.
	SizeLimitErrorEnum_RESPONSE_SIZE_LIMIT_EXCEEDED SizeLimitErrorEnum_SizeLimitError = 3
)

var SizeLimitErrorEnum_SizeLimitError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "REQUEST_SIZE_LIMIT_EXCEEDED",
	3: "RESPONSE_SIZE_LIMIT_EXCEEDED",
}

var SizeLimitErrorEnum_SizeLimitError_value = map[string]int32{
	"UNSPECIFIED":                  0,
	"UNKNOWN":                      1,
	"REQUEST_SIZE_LIMIT_EXCEEDED":  2,
	"RESPONSE_SIZE_LIMIT_EXCEEDED": 3,
}

func (x SizeLimitErrorEnum_SizeLimitError) String() string {
	return proto.EnumName(SizeLimitErrorEnum_SizeLimitError_name, int32(x))
}

func (SizeLimitErrorEnum_SizeLimitError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_2576de26de4e0e5e, []int{0, 0}
}

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

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

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

var xxx_messageInfo_SizeLimitErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.SizeLimitErrorEnum_SizeLimitError", SizeLimitErrorEnum_SizeLimitError_name, SizeLimitErrorEnum_SizeLimitError_value)
	proto.RegisterType((*SizeLimitErrorEnum)(nil), "google.ads.googleads.v3.errors.SizeLimitErrorEnum")
}

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

var fileDescriptor_2576de26de4e0e5e = []byte{
	// 328 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xf3, 0x40,
	0x14, 0x85, 0xff, 0xa4, 0xf0, 0x0b, 0x53, 0xd0, 0x12, 0x77, 0x5a, 0xaa, 0xe4, 0x01, 0x26, 0x8b,
	0xe0, 0x66, 0x5c, 0xa5, 0xcd, 0xb5, 0x04, 0x6b, 0x1a, 0x3b, 0x6d, 0x95, 0x12, 0x08, 0xd1, 0x84,
	0x61, 0xa0, 0x9d, 0xa9, 0x99, 0xd8, 0x45, 0x5f, 0xc0, 0xf7, 0x70, 0xe9, 0xa3, 0xf8, 0x28, 0x2e,
	0x7c, 0x06, 0x49, 0xc6, 0x06, 0x0a, 0xea, 0x6a, 0x0e, 0x97, 0xef, 0x9c, 0xb9, 0xe7, 0xa2, 0x0b,
	0x26, 0x25, 0x5b, 0xe6, 0x4e, 0x9a, 0x29, 0x47, 0xcb, 0x4a, 0x6d, 0x5c, 0x27, 0x2f, 0x0a, 0x59,
	0x28, 0x47, 0xf1, 0x6d, 0x9e, 0x2c, 0xf9, 0x8a, 0x97, 0x49, 0x3d, 0xc1, 0xeb, 0x42, 0x96, 0xd2,
	0xea, 0x69, 0x16, 0xa7, 0x99, 0xc2, 0x8d, 0x0d, 0x6f, 0x5c, 0xac, 0x6d, 0x27, 0xdd, 0x5d, 0xec,
	0x9a, 0x3b, 0xa9, 0x10, 0xb2, 0x4c, 0x4b, 0x2e, 0x85, 0xd2, 0x6e, 0xfb, 0xc5, 0x40, 0x16, 0xe5,
	0xdb, 0x7c, 0x54, 0xe5, 0x42, 0xe5, 0x00, 0xf1, 0xbc, 0xb2, 0x9f, 0xd0, 0xe1, 0xfe, 0xd4, 0x3a,
	0x42, 0xed, 0x59, 0x48, 0x23, 0x18, 0x04, 0x57, 0x01, 0xf8, 0x9d, 0x7f, 0x56, 0x1b, 0x1d, 0xcc,
	0xc2, 0xeb, 0x70, 0x7c, 0x17, 0x76, 0x0c, 0xeb, 0x0c, 0x9d, 0x4e, 0xe0, 0x76, 0x06, 0x74, 0x9a,
	0xd0, 0x60, 0x01, 0xc9, 0x28, 0xb8, 0x09, 0xa6, 0x09, 0xdc, 0x0f, 0x00, 0x7c, 0xf0, 0x3b, 0xa6,
	0x75, 0x8e, 0xba, 0x13, 0xa0, 0xd1, 0x38, 0xa4, 0xf0, 0x23, 0xd1, 0xea, 0x7f, 0x1a, 0xc8, 0x7e,
	0x94, 0x2b, 0xfc, 0x77, 0x9d, 0xfe, 0xf1, 0xfe, 0x5e, 0x51, 0xd5, 0x22, 0x32, 0x16, 0xfe, 0xb7,
	0x8d, 0xc9, 0x65, 0x2a, 0x18, 0x96, 0x05, 0x73, 0x58, 0x2e, 0xea, 0x8e, 0xbb, 0x63, 0xae, 0xb9,
	0xfa, 0xed, 0xb6, 0x97, 0xfa, 0x79, 0x35, 0x5b, 0x43, 0xcf, 0x7b, 0x33, 0x7b, 0x43, 0x1d, 0xe6,
	0x65, 0x0a, 0x6b, 0x59, 0xa9, 0xb9, 0x8b, 0xeb, 0x2f, 0xd5, 0xfb, 0x0e, 0x88, 0xbd, 0x4c, 0xc5,
	0x0d, 0x10, 0xcf, 0xdd, 0x58, 0x03, 0x1f, 0xa6, 0xad, 0xa7, 0x84, 0x78, 0x99, 0x22, 0xa4, 0x41,
	0x08, 0x99, 0xbb, 0x84, 0x68, 0xe8, 0xe1, 0x7f, 0xbd, 0x9d, 0xfb, 0x15, 0x00, 0x00, 0xff, 0xff,
	0xda, 0x18, 0x3a, 0xb9, 0xf8, 0x01, 0x00, 0x00,
}
