// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/hotel_rate_type.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 possible hotel rate types.
type HotelRateTypeEnum_HotelRateType int32

const (
	// Not specified.
	HotelRateTypeEnum_UNSPECIFIED HotelRateTypeEnum_HotelRateType = 0
	// The value is unknown in this version.
	HotelRateTypeEnum_UNKNOWN HotelRateTypeEnum_HotelRateType = 1
	// Rate type information is unavailable.
	HotelRateTypeEnum_UNAVAILABLE HotelRateTypeEnum_HotelRateType = 2
	// Rates available to everyone.
	HotelRateTypeEnum_PUBLIC_RATE HotelRateTypeEnum_HotelRateType = 3
	// A membership program rate is available and satisfies basic requirements
	// like having a public rate available. UI treatment will strikethrough the
	// public rate and indicate that a discount is available to the user. For
	// more on Qualified Rates, visit
	// https://developers.google.com/hotels/hotel-ads/dev-guide/qualified-rates
	HotelRateTypeEnum_QUALIFIED_RATE HotelRateTypeEnum_HotelRateType = 4
	// Rates available to users that satisfy some eligibility criteria. e.g.
	// all signed-in users, 20% of mobile users, all mobile users in Canada,
	// etc.
	HotelRateTypeEnum_PRIVATE_RATE HotelRateTypeEnum_HotelRateType = 5
)

var HotelRateTypeEnum_HotelRateType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "UNAVAILABLE",
	3: "PUBLIC_RATE",
	4: "QUALIFIED_RATE",
	5: "PRIVATE_RATE",
}

var HotelRateTypeEnum_HotelRateType_value = map[string]int32{
	"UNSPECIFIED":    0,
	"UNKNOWN":        1,
	"UNAVAILABLE":    2,
	"PUBLIC_RATE":    3,
	"QUALIFIED_RATE": 4,
	"PRIVATE_RATE":   5,
}

func (x HotelRateTypeEnum_HotelRateType) String() string {
	return proto.EnumName(HotelRateTypeEnum_HotelRateType_name, int32(x))
}

func (HotelRateTypeEnum_HotelRateType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e6359dfc1c88f2ee, []int{0, 0}
}

// Container for enum describing possible hotel rate types.
type HotelRateTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HotelRateTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.HotelRateTypeEnum_HotelRateType", HotelRateTypeEnum_HotelRateType_name, HotelRateTypeEnum_HotelRateType_value)
	proto.RegisterType((*HotelRateTypeEnum)(nil), "google.ads.googleads.v3.enums.HotelRateTypeEnum")
}

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

var fileDescriptor_e6359dfc1c88f2ee = []byte{
	// 332 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xdf, 0x4a, 0xf3, 0x30,
	0x1c, 0xfd, 0xda, 0x7d, 0x2a, 0x64, 0xfe, 0xa9, 0xb9, 0x14, 0x77, 0xb1, 0x3d, 0x40, 0x7a, 0x91,
	0xbb, 0x78, 0x95, 0xce, 0x3a, 0x8b, 0xa5, 0xd6, 0xb9, 0x56, 0x90, 0xc2, 0x88, 0x36, 0xd4, 0xc1,
	0x96, 0x94, 0x25, 0x1b, 0xec, 0x15, 0x7c, 0x0c, 0x2f, 0x7d, 0x14, 0x5f, 0x44, 0xf0, 0x29, 0xa4,
	0x89, 0x2b, 0xec, 0x42, 0x6f, 0xc2, 0xe1, 0x9c, 0xdf, 0x39, 0xe4, 0x1c, 0x80, 0x2b, 0x29, 0xab,
	0x39, 0xf7, 0x59, 0xa9, 0x7c, 0x0b, 0x1b, 0xb4, 0xc6, 0x3e, 0x17, 0xab, 0x85, 0xf2, 0x5f, 0xa4,
	0xe6, 0xf3, 0xe9, 0x92, 0x69, 0x3e, 0xd5, 0x9b, 0x9a, 0xa3, 0x7a, 0x29, 0xb5, 0x84, 0x3d, 0x7b,
	0x89, 0x58, 0xa9, 0x50, 0x6b, 0x42, 0x6b, 0x8c, 0x8c, 0xe9, 0xec, 0x7c, 0x9b, 0x59, 0xcf, 0x7c,
	0x26, 0x84, 0xd4, 0x4c, 0xcf, 0xa4, 0x50, 0xd6, 0x3c, 0x78, 0x75, 0xc0, 0xe9, 0x75, 0x13, 0x3b,
	0x66, 0x9a, 0x4f, 0x36, 0x35, 0x0f, 0xc5, 0x6a, 0x31, 0x58, 0x81, 0xa3, 0x1d, 0x12, 0x9e, 0x80,
	0x6e, 0x96, 0xdc, 0xa7, 0xe1, 0x30, 0xba, 0x8a, 0xc2, 0x4b, 0xef, 0x1f, 0xec, 0x82, 0x83, 0x2c,
	0xb9, 0x49, 0x6e, 0x1f, 0x12, 0xcf, 0xb1, 0x2a, 0xcd, 0x69, 0x14, 0xd3, 0x20, 0x0e, 0x3d, 0xb7,
	0x21, 0xd2, 0x2c, 0x88, 0xa3, 0xe1, 0x74, 0x4c, 0x27, 0xa1, 0xd7, 0x81, 0x10, 0x1c, 0xdf, 0x65,
	0x34, 0x36, 0x6e, 0xcb, 0xfd, 0x87, 0x1e, 0x38, 0x4c, 0xc7, 0x51, 0x4e, 0x27, 0xa1, 0x65, 0xf6,
	0x82, 0x4f, 0x07, 0xf4, 0x9f, 0xe5, 0x02, 0xfd, 0x59, 0x28, 0x80, 0x3b, 0x5f, 0x4b, 0x9b, 0x1a,
	0xa9, 0xf3, 0x18, 0xfc, 0x98, 0x2a, 0x39, 0x67, 0xa2, 0x42, 0x72, 0x59, 0xf9, 0x15, 0x17, 0xa6,
	0xe4, 0x76, 0xca, 0x7a, 0xa6, 0x7e, 0x59, 0xf6, 0xc2, 0xbc, 0x6f, 0x6e, 0x67, 0x44, 0xe9, 0xbb,
	0xdb, 0x1b, 0xd9, 0x28, 0x5a, 0x2a, 0x64, 0x61, 0x83, 0x72, 0x8c, 0x9a, 0x6d, 0xd4, 0xc7, 0x56,
	0x2f, 0x68, 0xa9, 0x8a, 0x56, 0x2f, 0x72, 0x5c, 0x18, 0xfd, 0xcb, 0xed, 0x5b, 0x92, 0x10, 0x5a,
	0x2a, 0x42, 0xda, 0x0b, 0x42, 0x72, 0x4c, 0x88, 0xb9, 0x79, 0xda, 0x37, 0x1f, 0xc3, 0xdf, 0x01,
	0x00, 0x00, 0xff, 0xff, 0x65, 0x27, 0xf0, 0x0f, 0xf1, 0x01, 0x00, 0x00,
}
