// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/ad_strength.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 listing the possible ad strengths.
type AdStrengthEnum_AdStrength int32

const (
	// Not specified.
	AdStrengthEnum_UNSPECIFIED AdStrengthEnum_AdStrength = 0
	// Used for return value only. Represents value unknown in this version.
	AdStrengthEnum_UNKNOWN AdStrengthEnum_AdStrength = 1
	// The ad strength is currently pending.
	AdStrengthEnum_PENDING AdStrengthEnum_AdStrength = 2
	// No ads could be generated.
	AdStrengthEnum_NO_ADS AdStrengthEnum_AdStrength = 3
	// Poor strength.
	AdStrengthEnum_POOR AdStrengthEnum_AdStrength = 4
	// Average strength.
	AdStrengthEnum_AVERAGE AdStrengthEnum_AdStrength = 5
	// Good strength.
	AdStrengthEnum_GOOD AdStrengthEnum_AdStrength = 6
	// Excellent strength.
	AdStrengthEnum_EXCELLENT AdStrengthEnum_AdStrength = 7
)

var AdStrengthEnum_AdStrength_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "PENDING",
	3: "NO_ADS",
	4: "POOR",
	5: "AVERAGE",
	6: "GOOD",
	7: "EXCELLENT",
}

var AdStrengthEnum_AdStrength_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"PENDING":     2,
	"NO_ADS":      3,
	"POOR":        4,
	"AVERAGE":     5,
	"GOOD":        6,
	"EXCELLENT":   7,
}

func (x AdStrengthEnum_AdStrength) String() string {
	return proto.EnumName(AdStrengthEnum_AdStrength_name, int32(x))
}

func (AdStrengthEnum_AdStrength) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3eea2cf3af8be160, []int{0, 0}
}

// Container for enum describing possible ad strengths.
type AdStrengthEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AdStrengthEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.AdStrengthEnum_AdStrength", AdStrengthEnum_AdStrength_name, AdStrengthEnum_AdStrength_value)
	proto.RegisterType((*AdStrengthEnum)(nil), "google.ads.googleads.v3.enums.AdStrengthEnum")
}

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

var fileDescriptor_3eea2cf3af8be160 = []byte{
	// 331 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, 0x68, 0x8d, 0x5a, 0xac, 0x2c, 0xab, 0xb2, 0x80, 0x03, 0x38, 0x8b, 0xec,
	0xdc, 0x95, 0x21, 0x6e, 0x84, 0x8a, 0x9c, 0x08, 0x4a, 0x5a, 0x55, 0x91, 0x50, 0x5a, 0x47, 0x2e,
	0x12, 0xd8, 0x08, 0x07, 0x6e, 0xd0, 0x8b, 0x74, 0xd9, 0xa3, 0xf4, 0x1c, 0x5d, 0xf5, 0x14, 0x95,
	0x1d, 0x08, 0xab, 0x76, 0x63, 0x8d, 0xdf, 0x9b, 0x19, 0xcd, 0x1b, 0xe0, 0x0b, 0xa5, 0xc4, 0xaa,
	0xf0, 0x73, 0xae, 0x0f, 0xd0, 0xa0, 0x7d, 0xe0, 0x17, 0x72, 0xb7, 0xd6, 0x7e, 0xce, 0x17, 0xba,
	0xdc, 0x16, 0x52, 0x94, 0xaf, 0x68, 0xb3, 0x55, 0xa5, 0xf2, 0x7a, 0x15, 0x0b, 0xe5, 0x5c, 0xa3,
	0x5a, 0x80, 0xf6, 0x01, 0xb2, 0x82, 0xab, 0xeb, 0xa3, 0xdf, 0x66, 0xe9, 0xe7, 0x52, 0xaa, 0x32,
	0x2f, 0x97, 0x4a, 0xea, 0x4a, 0x3c, 0x78, 0x73, 0xc0, 0x25, 0xe1, 0xb3, 0x83, 0x23, 0x95, 0xbb,
	0xf5, 0x40, 0x03, 0x70, 0x9a, 0x78, 0x5d, 0xd0, 0x99, 0xb3, 0x59, 0x42, 0x47, 0xe3, 0xdb, 0x31,
	0x0d, 0xe1, 0x3f, 0xaf, 0x03, 0xda, 0x73, 0x76, 0xc7, 0xe2, 0x07, 0x06, 0x1d, 0xf3, 0x49, 0x28,
	0x0b, 0xc7, 0x2c, 0x82, 0xae, 0x07, 0x40, 0x8b, 0xc5, 0x0b, 0x12, 0xce, 0x60, 0xc3, 0x3b, 0x03,
	0xcd, 0x24, 0x8e, 0xa7, 0xb0, 0x69, 0x28, 0x24, 0xa5, 0x53, 0x12, 0x51, 0xf8, 0xdf, 0x8c, 0xa3,
	0x38, 0x0e, 0x61, 0xcb, 0xbb, 0x00, 0xe7, 0xf4, 0x71, 0x44, 0x27, 0x13, 0xca, 0xee, 0x61, 0x7b,
	0xf8, 0xe5, 0x80, 0xfe, 0x8b, 0x5a, 0xa3, 0x3f, 0x6f, 0x19, 0x76, 0x4f, 0xc1, 0x12, 0x13, 0x3f,
	0x71, 0x9e, 0x86, 0x07, 0x85, 0x50, 0xab, 0x5c, 0x0a, 0xa4, 0xb6, 0xc2, 0x17, 0x85, 0xb4, 0xc7,
	0x1d, 0xeb, 0xdb, 0x2c, 0xf5, 0x2f, 0x6d, 0xde, 0xd8, 0xf7, 0xdd, 0x6d, 0x44, 0x84, 0x7c, 0xb8,
	0xbd, 0xa8, 0xb2, 0x22, 0x5c, 0xa3, 0x0a, 0x1a, 0x94, 0x06, 0xc8, 0xd4, 0xa2, 0x3f, 0x8f, 0xfb,
	0x8c, 0x70, 0x9d, 0xd5, 0xfb, 0x2c, 0x0d, 0x32, 0xbb, 0xff, 0x76, 0xfb, 0xd5, 0x10, 0x63, 0xc2,
	0x35, 0xc6, 0x35, 0x03, 0xe3, 0x34, 0xc0, 0xd8, 0x72, 0x9e, 0x5b, 0x36, 0x58, 0xf0, 0x13, 0x00,
	0x00, 0xff, 0xff, 0x86, 0x7e, 0x00, 0xb0, 0xe5, 0x01, 0x00, 0x00,
}
