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

package resources

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
	_ "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 customer extension setting.
type CustomerExtensionSetting struct {
	// Immutable. The resource name of the customer extension setting.
	// CustomerExtensionSetting resource names have the form:
	//
	// `customers/{customer_id}/customerExtensionSettings/{extension_type}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// Immutable. The extension type of the customer extension setting.
	ExtensionType enums.ExtensionTypeEnum_ExtensionType `protobuf:"varint,2,opt,name=extension_type,json=extensionType,proto3,enum=google.ads.googleads.v3.enums.ExtensionTypeEnum_ExtensionType" json:"extension_type,omitempty"`
	// The resource names of the extension feed items to serve under the customer.
	// ExtensionFeedItem resource names have the form:
	//
	// `customers/{customer_id}/extensionFeedItems/{feed_item_id}`
	ExtensionFeedItems []*wrappers.StringValue `protobuf:"bytes,3,rep,name=extension_feed_items,json=extensionFeedItems,proto3" json:"extension_feed_items,omitempty"`
	// The device for which the extensions will serve. Optional.
	Device               enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice `protobuf:"varint,4,opt,name=device,proto3,enum=google.ads.googleads.v3.enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice" json:"device,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                                `json:"-"`
	XXX_unrecognized     []byte                                                  `json:"-"`
	XXX_sizecache        int32                                                   `json:"-"`
}

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

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

var xxx_messageInfo_CustomerExtensionSetting proto.InternalMessageInfo

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

func (m *CustomerExtensionSetting) GetExtensionType() enums.ExtensionTypeEnum_ExtensionType {
	if m != nil {
		return m.ExtensionType
	}
	return enums.ExtensionTypeEnum_UNSPECIFIED
}

func (m *CustomerExtensionSetting) GetExtensionFeedItems() []*wrappers.StringValue {
	if m != nil {
		return m.ExtensionFeedItems
	}
	return nil
}

func (m *CustomerExtensionSetting) GetDevice() enums.ExtensionSettingDeviceEnum_ExtensionSettingDevice {
	if m != nil {
		return m.Device
	}
	return enums.ExtensionSettingDeviceEnum_UNSPECIFIED
}

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

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

var fileDescriptor_aad619780d8a95dd = []byte{
	// 528 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x41, 0x6b, 0x13, 0x41,
	0x14, 0x66, 0x93, 0xb6, 0xe0, 0x6a, 0x7b, 0x58, 0x3c, 0xc4, 0x52, 0x35, 0x15, 0x0a, 0x41, 0x64,
	0x06, 0xb3, 0x27, 0x57, 0x11, 0x66, 0xb5, 0x16, 0x15, 0x24, 0xa4, 0x92, 0x83, 0x04, 0x97, 0x49,
	0xf6, 0x65, 0x3b, 0x92, 0x9d, 0x59, 0x76, 0x66, 0xa3, 0x45, 0x8a, 0x1e, 0x3c, 0xf9, 0x33, 0x3c,
	0xfa, 0x53, 0xfc, 0x05, 0x1e, 0x7b, 0xee, 0x4f, 0xe8, 0x49, 0xb2, 0x3b, 0x33, 0x49, 0x5a, 0x56,
	0x8b, 0xb7, 0x2f, 0xf3, 0xbe, 0xf7, 0xbd, 0xf7, 0xbe, 0x97, 0xb7, 0x6e, 0x98, 0x08, 0x91, 0x4c,
	0x01, 0xd3, 0x58, 0xe2, 0x0a, 0xce, 0xd1, 0xcc, 0xc7, 0x39, 0x48, 0x51, 0xe4, 0x63, 0x90, 0x78,
	0x5c, 0x48, 0x25, 0x52, 0xc8, 0x23, 0xf8, 0xa4, 0x80, 0x4b, 0x26, 0x78, 0x24, 0x41, 0x29, 0xc6,
	0x13, 0x94, 0xe5, 0x42, 0x09, 0x6f, 0xb7, 0x4a, 0x44, 0x34, 0x96, 0xc8, 0x6a, 0xa0, 0x99, 0x8f,
	0xac, 0xc6, 0xf6, 0x93, 0xba, 0x32, 0xc0, 0x8b, 0x54, 0xe2, 0x4b, 0xca, 0x51, 0x0c, 0x33, 0x36,
	0x86, 0xaa, 0xc0, 0x76, 0xf7, 0xaa, 0xd9, 0xea, 0x38, 0x33, 0x39, 0x77, 0x4d, 0x4e, 0xc6, 0xf0,
	0x84, 0xc1, 0x34, 0x8e, 0x46, 0x70, 0x44, 0x67, 0x4c, 0xe4, 0x9a, 0x70, 0x6b, 0x89, 0x60, 0x1a,
	0xd5, 0xa1, 0x3b, 0x3a, 0x54, 0xfe, 0x1a, 0x15, 0x13, 0xfc, 0x31, 0xa7, 0x59, 0x06, 0xb9, 0xd4,
	0xf1, 0x9d, 0xa5, 0x54, 0xca, 0xb9, 0x50, 0x54, 0x31, 0xc1, 0x75, 0xf4, 0xde, 0xef, 0x35, 0xb7,
	0xf5, 0x4c, 0x7b, 0xb6, 0x6f, 0x5a, 0x3b, 0xac, 0xe6, 0xf2, 0xde, 0xbb, 0x9b, 0xa6, 0x58, 0xc4,
	0x69, 0x0a, 0x2d, 0xa7, 0xed, 0x74, 0xae, 0x85, 0x8f, 0x4e, 0xc9, 0xfa, 0x39, 0xf1, 0xdd, 0x87,
	0x0b, 0xff, 0x34, 0xca, 0x98, 0x44, 0x63, 0x91, 0xe2, 0x3a, 0xc5, 0xfe, 0x0d, 0xa3, 0xf7, 0x86,
	0xa6, 0xe0, 0x7d, 0x70, 0xb7, 0x56, 0xed, 0x68, 0x35, 0xda, 0x4e, 0x67, 0xab, 0xfb, 0x14, 0xd5,
	0x2d, 0xa9, 0xf4, 0x10, 0x59, 0xd9, 0xb7, 0xc7, 0x19, 0xec, 0xf3, 0x22, 0x5d, 0x7d, 0x09, 0x9b,
	0xa7, 0x64, 0xbd, 0xbf, 0x09, 0xcb, 0x6f, 0xde, 0x17, 0xf7, 0xe6, 0xa2, 0xd6, 0x04, 0x20, 0x8e,
	0x98, 0x82, 0x54, 0xb6, 0x9a, 0xed, 0x66, 0xe7, 0x7a, 0x77, 0xc7, 0x54, 0x34, 0x2e, 0xa2, 0x43,
	0x95, 0x33, 0x9e, 0x0c, 0xe8, 0xb4, 0x80, 0x10, 0x9f, 0x93, 0x07, 0xee, 0xfd, 0xda, 0x69, 0x6d,
	0xf1, 0x17, 0x00, 0xf1, 0x4b, 0x05, 0x69, 0xdf, 0x83, 0x8b, 0x4f, 0xd2, 0x3b, 0x72, 0x37, 0xaa,
	0xff, 0x49, 0x6b, 0xad, 0x1c, 0xb2, 0x77, 0xd5, 0x21, 0xb5, 0x77, 0xcf, 0xcb, 0xe4, 0xd5, 0x69,
	0x57, 0x42, 0x7d, 0xad, 0x1f, 0x7c, 0x73, 0xce, 0xc8, 0x57, 0xe7, 0x3f, 0xd6, 0xe3, 0xbd, 0x36,
	0xe7, 0x23, 0xf1, 0x67, 0x03, 0x4f, 0xec, 0x4d, 0x5d, 0xa4, 0x2f, 0x91, 0x2e, 0x9f, 0xdb, 0x49,
	0xf8, 0xbd, 0xe1, 0xee, 0x8d, 0x45, 0x8a, 0xfe, 0x79, 0x70, 0xe1, 0xed, 0xba, 0x86, 0x7a, 0xf3,
	0x6d, 0xf4, 0x9c, 0x77, 0xaf, 0xb4, 0x46, 0x22, 0xa6, 0x94, 0x27, 0x48, 0xe4, 0x09, 0x4e, 0x80,
	0x97, 0xbb, 0xc2, 0x8b, 0xd9, 0xfe, 0xf2, 0x5d, 0x78, 0x6c, 0xd1, 0x8f, 0x46, 0xf3, 0x80, 0x90,
	0x9f, 0x8d, 0xdd, 0x83, 0x4a, 0x92, 0xc4, 0x12, 0x55, 0x70, 0x8e, 0x06, 0x3e, 0xea, 0x1b, 0xe6,
	0x2f, 0xc3, 0x19, 0x92, 0x58, 0x0e, 0x2d, 0x67, 0x38, 0xf0, 0x87, 0x96, 0x73, 0xd6, 0xd8, 0xab,
	0x02, 0x41, 0x40, 0x62, 0x19, 0x04, 0x96, 0x15, 0x04, 0x03, 0x3f, 0x08, 0x2c, 0x6f, 0xb4, 0x51,
	0x36, 0xeb, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x23, 0x0f, 0x6d, 0x77, 0xc3, 0x04, 0x00, 0x00,
}
