// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/price_extension_price_qualifier.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

// Enums of price extension price qualifier.
type PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier int32

const (
	// Not specified.
	PriceExtensionPriceQualifierEnum_UNSPECIFIED PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier = 0
	// Used for return value only. Represents value unknown in this version.
	PriceExtensionPriceQualifierEnum_UNKNOWN PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier = 1
	// 'From' qualifier for the price.
	PriceExtensionPriceQualifierEnum_FROM PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier = 2
	// 'Up to' qualifier for the price.
	PriceExtensionPriceQualifierEnum_UP_TO PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier = 3
	// 'Average' qualifier for the price.
	PriceExtensionPriceQualifierEnum_AVERAGE PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier = 4
)

var PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "FROM",
	3: "UP_TO",
	4: "AVERAGE",
}

var PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"FROM":        2,
	"UP_TO":       3,
	"AVERAGE":     4,
}

func (x PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier) String() string {
	return proto.EnumName(PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier_name, int32(x))
}

func (PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa4a6b7a443225c4, []int{0, 0}
}

// Container for enum describing a price extension price qualifier.
type PriceExtensionPriceQualifierEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PriceExtensionPriceQualifierEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier", PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier_name, PriceExtensionPriceQualifierEnum_PriceExtensionPriceQualifier_value)
	proto.RegisterType((*PriceExtensionPriceQualifierEnum)(nil), "google.ads.googleads.v3.enums.PriceExtensionPriceQualifierEnum")
}

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

var fileDescriptor_fa4a6b7a443225c4 = []byte{
	// 324 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xbb, 0x4e, 0xc3, 0x30,
	0x14, 0x25, 0x69, 0x79, 0xb9, 0x03, 0x51, 0x46, 0xd4, 0x4a, 0xb4, 0x1f, 0xe0, 0x0c, 0xd9, 0xcc,
	0xe4, 0x96, 0xb4, 0xaa, 0x10, 0x69, 0x28, 0x34, 0x48, 0x28, 0xa2, 0x32, 0x8d, 0xb1, 0x2c, 0xb5,
	0x76, 0x88, 0xd3, 0x8a, 0x99, 0x4f, 0x61, 0xe4, 0x53, 0xf8, 0x14, 0x3e, 0x80, 0x19, 0xd9, 0x26,
	0xdd, 0xc8, 0x62, 0x9d, 0xeb, 0x7b, 0xee, 0xb9, 0xf7, 0x1c, 0x30, 0x62, 0x52, 0xb2, 0x35, 0x0d,
	0x48, 0xae, 0x02, 0x0b, 0x35, 0xda, 0x85, 0x01, 0x15, 0xdb, 0x8d, 0x0a, 0x8a, 0x92, 0xaf, 0xe8,
	0x92, 0xbe, 0x55, 0x54, 0x28, 0x2e, 0xc5, 0xd2, 0xd6, 0xaf, 0x5b, 0xb2, 0xe6, 0x2f, 0x9c, 0x96,
	0xb0, 0x28, 0x65, 0x25, 0xfd, 0x9e, 0x9d, 0x84, 0x24, 0x57, 0x70, 0x2f, 0x02, 0x77, 0x21, 0x34,
	0x22, 0xe7, 0xdd, 0x7a, 0x47, 0xc1, 0x03, 0x22, 0x84, 0xac, 0x48, 0xc5, 0xa5, 0x50, 0x76, 0x78,
	0xf0, 0xee, 0x80, 0x8b, 0x44, 0xcb, 0x46, 0xf5, 0x16, 0x53, 0xdd, 0xd6, 0x3b, 0x22, 0xb1, 0xdd,
	0x0c, 0x9e, 0x40, 0xb7, 0x89, 0xe3, 0x9f, 0x81, 0xce, 0x22, 0xbe, 0x4b, 0xa2, 0xd1, 0x74, 0x3c,
	0x8d, 0xae, 0xbc, 0x03, 0xbf, 0x03, 0x8e, 0x17, 0xf1, 0x75, 0x3c, 0x7b, 0x88, 0x3d, 0xc7, 0x3f,
	0x01, 0xed, 0xf1, 0x7c, 0x76, 0xe3, 0xb9, 0xfe, 0x29, 0x38, 0x5c, 0x24, 0xcb, 0xfb, 0x99, 0xd7,
	0xd2, 0x0c, 0x9c, 0x46, 0x73, 0x3c, 0x89, 0xbc, 0xf6, 0xf0, 0xc7, 0x01, 0xfd, 0x95, 0xdc, 0xc0,
	0x46, 0x23, 0xc3, 0x7e, 0xd3, 0x0d, 0x89, 0x76, 0x93, 0x38, 0x8f, 0xc3, 0x3f, 0x0d, 0x26, 0xd7,
	0x44, 0x30, 0x28, 0x4b, 0x16, 0x30, 0x2a, 0x8c, 0xd7, 0x3a, 0xe1, 0x82, 0xab, 0x7f, 0x02, 0xbf,
	0x34, 0xef, 0x87, 0xdb, 0x9a, 0x60, 0xfc, 0xe9, 0xf6, 0x26, 0x56, 0x0a, 0xe7, 0x0a, 0x5a, 0xa8,
	0x51, 0x1a, 0x42, 0x9d, 0x89, 0xfa, 0xaa, 0xfb, 0x19, 0xce, 0x55, 0xb6, 0xef, 0x67, 0x69, 0x98,
	0x99, 0xfe, 0xb7, 0xdb, 0xb7, 0x9f, 0x08, 0xe1, 0x5c, 0x21, 0xb4, 0x67, 0x20, 0x94, 0x86, 0x08,
	0x19, 0xce, 0xf3, 0x91, 0x39, 0x2c, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x8d, 0x8d, 0xaf,
	0x08, 0x02, 0x00, 0x00,
}
