// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/new_resource_creation_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 new resource creation errors.
type NewResourceCreationErrorEnum_NewResourceCreationError int32

const (
	// Enum unspecified.
	NewResourceCreationErrorEnum_UNSPECIFIED NewResourceCreationErrorEnum_NewResourceCreationError = 0
	// The received error code is not known in this version.
	NewResourceCreationErrorEnum_UNKNOWN NewResourceCreationErrorEnum_NewResourceCreationError = 1
	// Do not set the id field while creating new resources.
	NewResourceCreationErrorEnum_CANNOT_SET_ID_FOR_CREATE NewResourceCreationErrorEnum_NewResourceCreationError = 2
	// Creating more than one resource with the same temp ID is not allowed.
	NewResourceCreationErrorEnum_DUPLICATE_TEMP_IDS NewResourceCreationErrorEnum_NewResourceCreationError = 3
	// Parent resource with specified temp ID failed validation, so no
	// validation will be done for this child resource.
	NewResourceCreationErrorEnum_TEMP_ID_RESOURCE_HAD_ERRORS NewResourceCreationErrorEnum_NewResourceCreationError = 4
)

var NewResourceCreationErrorEnum_NewResourceCreationError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "CANNOT_SET_ID_FOR_CREATE",
	3: "DUPLICATE_TEMP_IDS",
	4: "TEMP_ID_RESOURCE_HAD_ERRORS",
}

var NewResourceCreationErrorEnum_NewResourceCreationError_value = map[string]int32{
	"UNSPECIFIED":                 0,
	"UNKNOWN":                     1,
	"CANNOT_SET_ID_FOR_CREATE":    2,
	"DUPLICATE_TEMP_IDS":          3,
	"TEMP_ID_RESOURCE_HAD_ERRORS": 4,
}

func (x NewResourceCreationErrorEnum_NewResourceCreationError) String() string {
	return proto.EnumName(NewResourceCreationErrorEnum_NewResourceCreationError_name, int32(x))
}

func (NewResourceCreationErrorEnum_NewResourceCreationError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_629e6b04c6296440, []int{0, 0}
}

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

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

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

var xxx_messageInfo_NewResourceCreationErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.NewResourceCreationErrorEnum_NewResourceCreationError", NewResourceCreationErrorEnum_NewResourceCreationError_name, NewResourceCreationErrorEnum_NewResourceCreationError_value)
	proto.RegisterType((*NewResourceCreationErrorEnum)(nil), "google.ads.googleads.v3.errors.NewResourceCreationErrorEnum")
}

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

var fileDescriptor_629e6b04c6296440 = []byte{
	// 366 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x4f, 0x6e, 0xa3, 0x30,
	0x14, 0xc6, 0x07, 0x32, 0x9a, 0x91, 0x9c, 0xc5, 0x20, 0x16, 0xa3, 0x68, 0x26, 0x93, 0x91, 0x38,
	0x80, 0x59, 0xb0, 0xf3, 0x6c, 0xc6, 0x01, 0x27, 0x45, 0x6d, 0x01, 0x19, 0x48, 0xa5, 0x0a, 0xc9,
	0xa2, 0xc1, 0x42, 0x91, 0x12, 0x1c, 0xd9, 0xf9, 0x73, 0x8c, 0xde, 0xa1, 0xcb, 0xae, 0x7a, 0x8e,
	0x1e, 0xa5, 0x27, 0xe8, 0xb2, 0x02, 0x93, 0xec, 0xd2, 0x15, 0x1f, 0xf6, 0xef, 0x7d, 0xdf, 0x7b,
	0x7e, 0xe0, 0x7f, 0x2d, 0x44, 0xbd, 0xe6, 0x6e, 0x59, 0x29, 0x57, 0xcb, 0x56, 0x1d, 0x3c, 0x97,
	0x4b, 0x29, 0xa4, 0x72, 0x1b, 0x7e, 0x64, 0x92, 0x2b, 0xb1, 0x97, 0x4b, 0xce, 0x96, 0x92, 0x97,
	0xbb, 0x95, 0x68, 0x58, 0x77, 0x09, 0xb7, 0x52, 0xec, 0x84, 0x3d, 0xd1, 0x65, 0xb0, 0xac, 0x14,
	0x3c, 0x3b, 0xc0, 0x83, 0x07, 0xb5, 0xc3, 0xaf, 0xf1, 0x29, 0x61, 0xbb, 0x72, 0xcb, 0xa6, 0x11,
	0xbb, 0xce, 0x42, 0xe9, 0x6a, 0xe7, 0xc5, 0x00, 0xe3, 0x88, 0x1f, 0x69, 0x1f, 0xe1, 0xf7, 0x09,
	0xa4, 0xad, 0x25, 0xcd, 0x7e, 0xe3, 0x3c, 0x1a, 0x60, 0x74, 0x09, 0xb0, 0x7f, 0x80, 0x61, 0x1e,
	0xa5, 0x09, 0xf1, 0xc3, 0x59, 0x48, 0x02, 0xeb, 0x8b, 0x3d, 0x04, 0xdf, 0xf3, 0xe8, 0x3a, 0x8a,
	0xef, 0x22, 0xcb, 0xb0, 0xc7, 0x60, 0xe4, 0xe3, 0x28, 0x8a, 0x33, 0x96, 0x92, 0x8c, 0x85, 0x01,
	0x9b, 0xc5, 0x94, 0xf9, 0x94, 0xe0, 0x8c, 0x58, 0xa6, 0xfd, 0x13, 0xd8, 0x41, 0x9e, 0xdc, 0x84,
	0x3e, 0xce, 0x08, 0xcb, 0xc8, 0x6d, 0xc2, 0xc2, 0x20, 0xb5, 0x06, 0xf6, 0x5f, 0xf0, 0xbb, 0xff,
	0x63, 0x94, 0xa4, 0x71, 0x4e, 0x7d, 0xc2, 0xae, 0x70, 0xc0, 0x08, 0xa5, 0x31, 0x4d, 0xad, 0xaf,
	0xd3, 0x77, 0x03, 0x38, 0x4b, 0xb1, 0x81, 0x9f, 0xcf, 0x3d, 0xfd, 0x73, 0xa9, 0xeb, 0xa4, 0x1d,
	0x3c, 0x31, 0xee, 0x83, 0xde, 0xa0, 0x16, 0xeb, 0xb2, 0xa9, 0xa1, 0x90, 0xb5, 0x5b, 0xf3, 0xa6,
	0x7b, 0x96, 0xd3, 0x2a, 0xb6, 0x2b, 0x75, 0x69, 0x33, 0xff, 0xf4, 0xe7, 0xc9, 0x1c, 0xcc, 0x31,
	0x7e, 0x36, 0x27, 0x73, 0x6d, 0x86, 0x2b, 0x05, 0xb5, 0x6c, 0xd5, 0xc2, 0x83, 0x5d, 0xa4, 0x7a,
	0x3d, 0x01, 0x05, 0xae, 0x54, 0x71, 0x06, 0x8a, 0x85, 0x57, 0x68, 0xe0, 0xcd, 0x74, 0xf4, 0x29,
	0x42, 0xb8, 0x52, 0x08, 0x9d, 0x11, 0x84, 0x16, 0x1e, 0x42, 0x1a, 0x7a, 0xf8, 0xd6, 0x75, 0xe7,
	0x7d, 0x04, 0x00, 0x00, 0xff, 0xff, 0x61, 0xf5, 0xa1, 0xda, 0x36, 0x02, 0x00, 0x00,
}
