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

const (
	// Enum unspecified.
	SharedCriterionErrorEnum_UNSPECIFIED SharedCriterionErrorEnum_SharedCriterionError = 0
	// The received error code is not known in this version.
	SharedCriterionErrorEnum_UNKNOWN SharedCriterionErrorEnum_SharedCriterionError = 1
	// The criterion is not appropriate for the shared set type.
	SharedCriterionErrorEnum_CRITERION_TYPE_NOT_ALLOWED_FOR_SHARED_SET_TYPE SharedCriterionErrorEnum_SharedCriterionError = 2
)

var SharedCriterionErrorEnum_SharedCriterionError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "CRITERION_TYPE_NOT_ALLOWED_FOR_SHARED_SET_TYPE",
}

var SharedCriterionErrorEnum_SharedCriterionError_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"CRITERION_TYPE_NOT_ALLOWED_FOR_SHARED_SET_TYPE": 2,
}

func (x SharedCriterionErrorEnum_SharedCriterionError) String() string {
	return proto.EnumName(SharedCriterionErrorEnum_SharedCriterionError_name, int32(x))
}

func (SharedCriterionErrorEnum_SharedCriterionError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c4025b0e5768e09e, []int{0, 0}
}

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

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

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

var xxx_messageInfo_SharedCriterionErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.SharedCriterionErrorEnum_SharedCriterionError", SharedCriterionErrorEnum_SharedCriterionError_name, SharedCriterionErrorEnum_SharedCriterionError_value)
	proto.RegisterType((*SharedCriterionErrorEnum)(nil), "google.ads.googleads.v3.errors.SharedCriterionErrorEnum")
}

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

var fileDescriptor_c4025b0e5768e09e = []byte{
	// 331 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4e, 0xf3, 0x30,
	0x10, 0x85, 0xff, 0xe4, 0x97, 0x40, 0x72, 0x17, 0x54, 0x11, 0x0b, 0x40, 0xa8, 0x8b, 0x1c, 0xc0,
	0x91, 0xc8, 0xce, 0x5d, 0xb9, 0x8d, 0x5b, 0x22, 0xaa, 0x24, 0x4a, 0xd2, 0x56, 0xa0, 0x48, 0x56,
	0x68, 0xa2, 0x34, 0x52, 0x6b, 0x57, 0x76, 0xe8, 0x09, 0x38, 0x09, 0x4b, 0x8e, 0xc2, 0x51, 0x58,
	0x73, 0x00, 0x14, 0x9b, 0x64, 0x55, 0x58, 0xf9, 0x69, 0xe6, 0x7d, 0xcf, 0x33, 0x03, 0xc6, 0x15,
	0xe7, 0xd5, 0xae, 0x74, 0xf2, 0x42, 0x3a, 0x5a, 0xb6, 0xea, 0xe8, 0x3a, 0xa5, 0x10, 0x5c, 0x48,
	0x47, 0x6e, 0x73, 0x51, 0x16, 0x74, 0x23, 0xea, 0xa6, 0x14, 0x35, 0x67, 0x54, 0xd5, 0xe1, 0x41,
	0xf0, 0x86, 0x5b, 0x23, 0x4d, 0xc0, 0xbc, 0x90, 0xb0, 0x87, 0xe1, 0xd1, 0x85, 0x1a, 0xbe, 0xb9,
	0xed, 0xc2, 0x0f, 0xb5, 0x93, 0x33, 0xc6, 0x9b, 0xbc, 0xa9, 0x39, 0x93, 0x9a, 0xb6, 0x5f, 0x0d,
	0x70, 0x95, 0xa8, 0xf8, 0x69, 0x97, 0x4e, 0x5a, 0x8e, 0xb0, 0x97, 0xbd, 0xbd, 0x05, 0x97, 0xa7,
	0x7a, 0xd6, 0x05, 0x18, 0x2c, 0x83, 0x24, 0x22, 0x53, 0x7f, 0xe6, 0x13, 0x6f, 0xf8, 0xcf, 0x1a,
	0x80, 0xf3, 0x65, 0xf0, 0x10, 0x84, 0xeb, 0x60, 0x68, 0x58, 0x77, 0x00, 0x4e, 0x63, 0x3f, 0x25,
	0xb1, 0x1f, 0x06, 0x34, 0x7d, 0x8c, 0x08, 0x0d, 0xc2, 0x94, 0xe2, 0xc5, 0x22, 0x5c, 0x13, 0x8f,
	0xce, 0xc2, 0x98, 0x26, 0xf7, 0x38, 0x26, 0x1e, 0x4d, 0x48, 0xaa, 0xfa, 0x43, 0x73, 0xf2, 0x65,
	0x00, 0x7b, 0xc3, 0xf7, 0xf0, 0xef, 0x5d, 0x26, 0xd7, 0xa7, 0xc6, 0x89, 0xda, 0x45, 0x22, 0xe3,
	0xc9, 0xfb, 0x81, 0x2b, 0xbe, 0xcb, 0x59, 0x05, 0xb9, 0xa8, 0x9c, 0xaa, 0x64, 0x6a, 0xcd, 0xee,
	0xaa, 0x87, 0x5a, 0xfe, 0x76, 0xe4, 0xb1, 0x7e, 0xde, 0xcc, 0xff, 0x73, 0x8c, 0xdf, 0xcd, 0xd1,
	0x5c, 0x87, 0xe1, 0x42, 0x42, 0x2d, 0x5b, 0xb5, 0x72, 0xa1, 0xfa, 0x52, 0x7e, 0x74, 0x86, 0x0c,
	0x17, 0x32, 0xeb, 0x0d, 0xd9, 0xca, 0xcd, 0xb4, 0xe1, 0xd3, 0xb4, 0x75, 0x15, 0x21, 0x5c, 0x48,
	0x84, 0x7a, 0x0b, 0x42, 0x2b, 0x17, 0x21, 0x6d, 0x7a, 0x3e, 0x53, 0xd3, 0xb9, 0xdf, 0x01, 0x00,
	0x00, 0xff, 0xff, 0xc5, 0x8d, 0x33, 0x50, 0x01, 0x02, 0x00, 0x00,
}
