// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/product_condition.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 condition of a product offer.
type ProductConditionEnum_ProductCondition int32

const (
	// Not specified.
	ProductConditionEnum_UNSPECIFIED ProductConditionEnum_ProductCondition = 0
	// Used for return value only. Represents value unknown in this version.
	ProductConditionEnum_UNKNOWN ProductConditionEnum_ProductCondition = 1
	// The product condition is new.
	ProductConditionEnum_NEW ProductConditionEnum_ProductCondition = 3
	// The product condition is refurbished.
	ProductConditionEnum_REFURBISHED ProductConditionEnum_ProductCondition = 4
	// The product condition is used.
	ProductConditionEnum_USED ProductConditionEnum_ProductCondition = 5
)

var ProductConditionEnum_ProductCondition_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	3: "NEW",
	4: "REFURBISHED",
	5: "USED",
}

var ProductConditionEnum_ProductCondition_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"NEW":         3,
	"REFURBISHED": 4,
	"USED":        5,
}

func (x ProductConditionEnum_ProductCondition) String() string {
	return proto.EnumName(ProductConditionEnum_ProductCondition_name, int32(x))
}

func (ProductConditionEnum_ProductCondition) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_ac799eb3636d41b8, []int{0, 0}
}

// Condition of a product offer.
type ProductConditionEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ProductConditionEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.ProductConditionEnum_ProductCondition", ProductConditionEnum_ProductCondition_name, ProductConditionEnum_ProductCondition_value)
	proto.RegisterType((*ProductConditionEnum)(nil), "google.ads.googleads.v3.enums.ProductConditionEnum")
}

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

var fileDescriptor_ac799eb3636d41b8 = []byte{
	// 309 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xbd, 0x6a, 0xf3, 0x30,
	0x14, 0xfd, 0xf2, 0xf3, 0x35, 0x45, 0x19, 0x2a, 0x4c, 0xbb, 0x94, 0x66, 0x48, 0x1e, 0x40, 0x1a,
	0x44, 0x17, 0x75, 0xb2, 0x13, 0x25, 0x0d, 0x05, 0xd7, 0x24, 0x75, 0x02, 0xc5, 0x50, 0xdc, 0x28,
	0x08, 0x43, 0x2c, 0x19, 0xcb, 0xce, 0x03, 0x75, 0xec, 0xa3, 0xf4, 0x51, 0xf2, 0x14, 0x45, 0x52,
	0xed, 0x21, 0xd0, 0x2e, 0xe2, 0x70, 0xcf, 0x8f, 0xce, 0xbd, 0xe0, 0x5e, 0x28, 0x25, 0x0e, 0x7b,
	0x9c, 0x72, 0x8d, 0x1d, 0x34, 0xe8, 0x48, 0xf0, 0x5e, 0xd6, 0xb9, 0xc6, 0x45, 0xa9, 0x78, 0xbd,
	0xab, 0xde, 0x76, 0x4a, 0xf2, 0xac, 0xca, 0x94, 0x44, 0x45, 0xa9, 0x2a, 0xe5, 0x8d, 0x9c, 0x16,
	0xa5, 0x5c, 0xa3, 0xd6, 0x86, 0x8e, 0x04, 0x59, 0xdb, 0xed, 0x5d, 0x93, 0x5a, 0x64, 0x38, 0x95,
	0x52, 0x55, 0xa9, 0xf1, 0x6a, 0x67, 0x9e, 0x1c, 0xc0, 0x75, 0xe4, 0x72, 0xa7, 0x4d, 0x2c, 0x93,
	0x75, 0x3e, 0x79, 0x01, 0xf0, 0x7c, 0xee, 0x5d, 0x81, 0x61, 0x1c, 0xae, 0x23, 0x36, 0x5d, 0xce,
	0x97, 0x6c, 0x06, 0xff, 0x79, 0x43, 0x30, 0x88, 0xc3, 0xa7, 0xf0, 0x79, 0x1b, 0xc2, 0x8e, 0x37,
	0x00, 0xbd, 0x90, 0x6d, 0x61, 0xcf, 0xc8, 0x56, 0x6c, 0x1e, 0xaf, 0x82, 0xe5, 0xfa, 0x91, 0xcd,
	0x60, 0xdf, 0xbb, 0x04, 0xfd, 0x78, 0xcd, 0x66, 0xf0, 0x7f, 0x70, 0xea, 0x80, 0xf1, 0x4e, 0xe5,
	0xe8, 0xcf, 0xc6, 0xc1, 0xcd, 0xf9, 0xcf, 0x91, 0xa9, 0x1a, 0x75, 0x5e, 0x83, 0x1f, 0x9f, 0x50,
	0x87, 0x54, 0x0a, 0xa4, 0x4a, 0x81, 0xc5, 0x5e, 0xda, 0x45, 0x9a, 0x83, 0x15, 0x99, 0xfe, 0xe5,
	0x7e, 0x0f, 0xf6, 0xfd, 0xe8, 0xf6, 0x16, 0xbe, 0xff, 0xd9, 0x1d, 0x2d, 0x5c, 0x94, 0xcf, 0x35,
	0x72, 0xd0, 0xa0, 0x0d, 0x41, 0x66, 0x7b, 0xfd, 0xd5, 0xf0, 0x89, 0xcf, 0x75, 0xd2, 0xf2, 0xc9,
	0x86, 0x24, 0x96, 0x3f, 0x75, 0xc7, 0x6e, 0x48, 0xa9, 0xcf, 0x35, 0xa5, 0xad, 0x82, 0xd2, 0x0d,
	0xa1, 0xd4, 0x6a, 0xde, 0x2f, 0x6c, 0x31, 0xf2, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x80, 0x3a, 0x94,
	0xa1, 0xd7, 0x01, 0x00, 0x00,
}
