// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/asset_performance_label.proto

package enums

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 the possible performance labels of an asset, usually
// computed in the context of a linkage.
type AssetPerformanceLabelEnum_AssetPerformanceLabel int32

const (
	// Not specified.
	AssetPerformanceLabelEnum_UNSPECIFIED AssetPerformanceLabelEnum_AssetPerformanceLabel = 0
	// Used for return value only. Represents value unknown in this version.
	AssetPerformanceLabelEnum_UNKNOWN AssetPerformanceLabelEnum_AssetPerformanceLabel = 1
	// This asset does not yet have any performance informantion. This may be
	// because it is still under review.
	AssetPerformanceLabelEnum_PENDING AssetPerformanceLabelEnum_AssetPerformanceLabel = 2
	// The asset has started getting impressions but the stats are not
	// statistically significant enough to get an asset performance label.
	AssetPerformanceLabelEnum_LEARNING AssetPerformanceLabelEnum_AssetPerformanceLabel = 3
	// Worst performing assets.
	AssetPerformanceLabelEnum_LOW AssetPerformanceLabelEnum_AssetPerformanceLabel = 4
	// Good performing assets.
	AssetPerformanceLabelEnum_GOOD AssetPerformanceLabelEnum_AssetPerformanceLabel = 5
	// Best performing assets.
	AssetPerformanceLabelEnum_BEST AssetPerformanceLabelEnum_AssetPerformanceLabel = 6
)

var AssetPerformanceLabelEnum_AssetPerformanceLabel_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "PENDING",
	3: "LEARNING",
	4: "LOW",
	5: "GOOD",
	6: "BEST",
}

var AssetPerformanceLabelEnum_AssetPerformanceLabel_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"PENDING":     2,
	"LEARNING":    3,
	"LOW":         4,
	"GOOD":        5,
	"BEST":        6,
}

func (x AssetPerformanceLabelEnum_AssetPerformanceLabel) String() string {
	return proto.EnumName(AssetPerformanceLabelEnum_AssetPerformanceLabel_name, int32(x))
}

func (AssetPerformanceLabelEnum_AssetPerformanceLabel) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_2c0d096edebf114e, []int{0, 0}
}

// Container for enum describing the performance label of an asset.
type AssetPerformanceLabelEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AssetPerformanceLabelEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.AssetPerformanceLabelEnum_AssetPerformanceLabel", AssetPerformanceLabelEnum_AssetPerformanceLabel_name, AssetPerformanceLabelEnum_AssetPerformanceLabel_value)
	proto.RegisterType((*AssetPerformanceLabelEnum)(nil), "google.ads.googleads.v3.enums.AssetPerformanceLabelEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/enums/asset_performance_label.proto", fileDescriptor_2c0d096edebf114e)
}

var fileDescriptor_2c0d096edebf114e = []byte{
	// 335 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x6e, 0xea, 0x30,
	0x14, 0xfc, 0x09, 0x7c, 0x40, 0xa6, 0x52, 0xa3, 0x48, 0x5d, 0x14, 0x95, 0x05, 0x1c, 0xc0, 0x59,
	0x64, 0x67, 0x56, 0x4e, 0x49, 0x23, 0x54, 0xe4, 0x44, 0xa5, 0x80, 0x54, 0x45, 0x42, 0x86, 0xb8,
	0x11, 0x52, 0x62, 0x47, 0x71, 0xe0, 0x10, 0x3d, 0x46, 0x97, 0x3d, 0x4a, 0x8f, 0xd2, 0x4d, 0xaf,
	0x50, 0x39, 0x2e, 0xe9, 0x86, 0x76, 0x63, 0xcd, 0xf3, 0xbc, 0x19, 0xbd, 0x19, 0x30, 0x49, 0x85,
	0x48, 0x33, 0xe6, 0xd0, 0x44, 0x3a, 0x1a, 0x2a, 0x74, 0x74, 0x1d, 0xc6, 0x0f, 0xb9, 0x74, 0xa8,
	0x94, 0xac, 0xda, 0x14, 0xac, 0x7c, 0x16, 0x65, 0x4e, 0xf9, 0x8e, 0x6d, 0x32, 0xba, 0x65, 0x19,
	0x2c, 0x4a, 0x51, 0x09, 0x7b, 0xa8, 0x15, 0x90, 0x26, 0x12, 0x36, 0x62, 0x78, 0x74, 0x61, 0x2d,
	0x1e, 0xdc, 0x9c, 0xbc, 0x8b, 0xbd, 0x43, 0x39, 0x17, 0x15, 0xad, 0xf6, 0x82, 0x4b, 0x2d, 0x1e,
	0xbf, 0x18, 0xe0, 0x1a, 0x2b, 0xfb, 0xe8, 0xc7, 0x7d, 0xae, 0xcc, 0x7d, 0x7e, 0xc8, 0xc7, 0x39,
	0xb8, 0x3a, 0x4b, 0xda, 0x97, 0xa0, 0xbf, 0x24, 0x8b, 0xc8, 0xbf, 0x9d, 0xdd, 0xcd, 0xfc, 0xa9,
	0xf5, 0xcf, 0xee, 0x83, 0xee, 0x92, 0xdc, 0x93, 0x70, 0x4d, 0x2c, 0x43, 0x0d, 0x91, 0x4f, 0xa6,
	0x33, 0x12, 0x58, 0xa6, 0x7d, 0x01, 0x7a, 0x73, 0x1f, 0x3f, 0x10, 0x35, 0xb5, 0xec, 0x2e, 0x68,
	0xcd, 0xc3, 0xb5, 0xd5, 0xb6, 0x7b, 0xa0, 0x1d, 0x84, 0xe1, 0xd4, 0xfa, 0xaf, 0x90, 0xe7, 0x2f,
	0x1e, 0xad, 0x8e, 0xf7, 0x69, 0x80, 0xd1, 0x4e, 0xe4, 0xf0, 0xcf, 0x40, 0xde, 0xe0, 0xec, 0x49,
	0x91, 0x8a, 0x13, 0x19, 0x4f, 0xde, 0xb7, 0x38, 0x15, 0x19, 0xe5, 0x29, 0x14, 0x65, 0xea, 0xa4,
	0x8c, 0xd7, 0x61, 0x4f, 0xd5, 0x16, 0x7b, 0xf9, 0x4b, 0xd3, 0x93, 0xfa, 0x7d, 0x35, 0x5b, 0x01,
	0xc6, 0x6f, 0xe6, 0x30, 0xd0, 0x56, 0x38, 0x91, 0x50, 0x43, 0x85, 0x56, 0x2e, 0x54, 0xdd, 0xc8,
	0xf7, 0x13, 0x1f, 0xe3, 0x44, 0xc6, 0x0d, 0x1f, 0xaf, 0xdc, 0xb8, 0xe6, 0x3f, 0xcc, 0x91, 0xfe,
	0x44, 0x08, 0x27, 0x12, 0xa1, 0x66, 0x03, 0xa1, 0x95, 0x8b, 0x50, 0xbd, 0xb3, 0xed, 0xd4, 0x87,
	0xb9, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe6, 0xc8, 0x63, 0xf0, 0x01, 0x02, 0x00, 0x00,
}
