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

package resources

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

// A hotel group view.
type HotelGroupView struct {
	// The resource name of the hotel group view.
	// Hotel Group view resource names have the form:
	//
	// `customers/{customer_id}/hotelGroupViews/{ad_group_id}~{criterion_id}`
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HotelGroupView proto.InternalMessageInfo

func (m *HotelGroupView) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

func init() {
	proto.RegisterType((*HotelGroupView)(nil), "google.ads.googleads.v3.resources.HotelGroupView")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/resources/hotel_group_view.proto", fileDescriptor_e471d0eff5bb8f4a)
}

var fileDescriptor_e471d0eff5bb8f4a = []byte{
	// 322 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xb1, 0x4e, 0xf3, 0x30,
	0x14, 0x85, 0x95, 0xfc, 0xd2, 0x2f, 0x11, 0x01, 0x43, 0x59, 0xa0, 0x62, 0xa0, 0xa0, 0x0a, 0x26,
	0x7b, 0xc8, 0x00, 0x32, 0x93, 0xbb, 0x14, 0x31, 0xa0, 0xaa, 0x43, 0x06, 0x14, 0xa9, 0x72, 0x13,
	0xcb, 0x44, 0x6a, 0x7c, 0x23, 0xdf, 0x34, 0x1d, 0xaa, 0x4a, 0x3c, 0x08, 0x13, 0x23, 0x8f, 0xc2,
	0xa3, 0xf4, 0x29, 0x50, 0xea, 0xda, 0x85, 0x0e, 0xb0, 0x1d, 0xe5, 0x7e, 0xe7, 0xdc, 0x7b, 0xe2,
	0xe8, 0x4e, 0x01, 0xa8, 0x99, 0xa4, 0x22, 0x47, 0x6a, 0x65, 0xab, 0x9a, 0x98, 0x1a, 0x89, 0x30,
	0x37, 0x99, 0x44, 0xfa, 0x02, 0xb5, 0x9c, 0x4d, 0x94, 0x81, 0x79, 0x35, 0x69, 0x0a, 0xb9, 0x20,
	0x95, 0x81, 0x1a, 0x3a, 0x3d, 0x8b, 0x13, 0x91, 0x23, 0xf1, 0x4e, 0xd2, 0xc4, 0xc4, 0x3b, 0xbb,
	0x67, 0x2e, 0xbc, 0x2a, 0x7c, 0x9e, 0x75, 0x77, 0xcf, 0xbf, 0x8d, 0x84, 0xd6, 0x50, 0x8b, 0xba,
	0x00, 0x8d, 0x76, 0x7a, 0xf9, 0x16, 0x44, 0xc7, 0x0f, 0xed, 0xda, 0x61, 0xbb, 0x35, 0x29, 0xe4,
	0xa2, 0x73, 0x15, 0x1d, 0xb9, 0x88, 0x89, 0x16, 0xa5, 0x3c, 0x0d, 0x2e, 0x82, 0x9b, 0x83, 0xf1,
	0xa1, 0xfb, 0xf8, 0x24, 0x4a, 0xc9, 0xe4, 0x9a, 0x4f, 0xa3, 0xeb, 0xdd, 0x35, 0x5b, 0x55, 0x15,
	0x48, 0x32, 0x28, 0xe9, 0x5e, 0xe4, 0x6d, 0x36, 0xc7, 0x1a, 0x4a, 0x69, 0x90, 0x2e, 0x9d, 0x5c,
	0xd9, 0xba, 0x1e, 0x42, 0xba, 0xdc, 0xef, 0xbf, 0x1a, 0xbc, 0x86, 0x51, 0x3f, 0x83, 0x92, 0xfc,
	0xf9, 0x07, 0x06, 0x27, 0x3f, 0x57, 0x8e, 0xda, 0x76, 0xa3, 0xe0, 0xf9, 0x71, 0xeb, 0x54, 0x30,
	0x13, 0x5a, 0x11, 0x30, 0x8a, 0x2a, 0xa9, 0x37, 0xdd, 0xe9, 0xee, 0xe6, 0x5f, 0x1e, 0xe5, 0xde,
	0xab, 0xf7, 0xf0, 0xdf, 0x90, 0xf3, 0x8f, 0xb0, 0x37, 0xb4, 0x91, 0x3c, 0x47, 0x62, 0x65, 0xab,
	0x92, 0x98, 0x8c, 0x1d, 0xf9, 0xe9, 0x98, 0x94, 0xe7, 0x98, 0x7a, 0x26, 0x4d, 0xe2, 0xd4, 0x33,
	0xeb, 0xb0, 0x6f, 0x07, 0x8c, 0xf1, 0x1c, 0x19, 0xf3, 0x14, 0x63, 0x49, 0xcc, 0x98, 0xe7, 0xa6,
	0xff, 0x37, 0xc7, 0xc6, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xae, 0xb3, 0x11, 0xa9, 0x40, 0x02,
	0x00, 0x00,
}
