// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/resources/campaign_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 campaign extension setting.
type CampaignExtensionSetting struct {
	// The resource name of the campaign extension setting.
	// CampaignExtensionSetting resource names have the form:
	//
	// `customers/{customer_id}/campaignExtensionSettings/{campaign_id}~{extension_type}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// 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 name of the campaign. The linked extension feed items will
	// serve under this campaign.
	// Campaign resource names have the form:
	//
	// `customers/{customer_id}/campaigns/{campaign_id}`
	Campaign *wrappers.StringValue `protobuf:"bytes,3,opt,name=campaign,proto3" json:"campaign,omitempty"`
	// The resource names of the extension feed items to serve under the campaign.
	// ExtensionFeedItem resource names have the form:
	//
	// `customers/{customer_id}/extensionFeedItems/{feed_item_id}`
	ExtensionFeedItems []*wrappers.StringValue `protobuf:"bytes,4,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,5,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 *CampaignExtensionSetting) Reset()         { *m = CampaignExtensionSetting{} }
func (m *CampaignExtensionSetting) String() string { return proto.CompactTextString(m) }
func (*CampaignExtensionSetting) ProtoMessage()    {}
func (*CampaignExtensionSetting) Descriptor() ([]byte, []int) {
	return fileDescriptor_61cdf4a6d2d3087e, []int{0}
}

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

var xxx_messageInfo_CampaignExtensionSetting proto.InternalMessageInfo

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

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

func (m *CampaignExtensionSetting) GetCampaign() *wrappers.StringValue {
	if m != nil {
		return m.Campaign
	}
	return nil
}

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

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

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

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

var fileDescriptor_61cdf4a6d2d3087e = []byte{
	// 493 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x41, 0x6b, 0xd4, 0x40,
	0x14, 0x26, 0xd9, 0x5a, 0x34, 0xda, 0x1e, 0x82, 0x87, 0x58, 0xaa, 0x6c, 0x95, 0xc2, 0x9e, 0x66,
	0x70, 0x73, 0x91, 0x28, 0x42, 0x56, 0x6b, 0x51, 0xa1, 0x2c, 0xa9, 0xec, 0x41, 0x16, 0xc2, 0x34,
	0x79, 0x8d, 0x03, 0x3b, 0x33, 0x21, 0x33, 0x59, 0x2d, 0x52, 0xf0, 0xe0, 0xc9, 0x7f, 0xa1, 0x47,
	0x7f, 0x8a, 0x3f, 0xa5, 0xbf, 0x42, 0x92, 0xcc, 0xcc, 0x76, 0x95, 0xb4, 0xbd, 0x7d, 0x99, 0xf7,
	0x7d, 0xdf, 0x7b, 0xdf, 0x9b, 0x8c, 0x37, 0x29, 0x84, 0x28, 0x16, 0x80, 0x49, 0x2e, 0x71, 0x07,
	0x1b, 0xb4, 0x0c, 0x71, 0x05, 0x52, 0xd4, 0x55, 0x06, 0x12, 0x67, 0x84, 0x95, 0x84, 0x16, 0x3c,
	0x85, 0x2f, 0x0a, 0xb8, 0xa4, 0x82, 0xa7, 0x12, 0x94, 0xa2, 0xbc, 0x40, 0x65, 0x25, 0x94, 0xf0,
	0xf7, 0x3a, 0x21, 0x22, 0xb9, 0x44, 0xd6, 0x03, 0x2d, 0x43, 0x64, 0x3d, 0x76, 0x5e, 0xf4, 0xb5,
	0x01, 0x5e, 0x33, 0x89, 0xff, 0x73, 0x4e, 0x73, 0x58, 0xd2, 0x0c, 0xba, 0x06, 0x3b, 0xe3, 0x9b,
	0xaa, 0xd5, 0x59, 0x69, 0x34, 0x0f, 0x8c, 0xa6, 0xa4, 0x36, 0x8b, 0x2e, 0x3d, 0xd2, 0xa5, 0xf6,
	0xeb, 0xa4, 0x3e, 0xc5, 0x9f, 0x2b, 0x52, 0x96, 0x50, 0x49, 0x5d, 0xdf, 0xbd, 0x24, 0x25, 0x9c,
	0x0b, 0x45, 0x14, 0x15, 0x5c, 0x57, 0x1f, 0xff, 0xdc, 0xf0, 0x82, 0x57, 0x7a, 0x25, 0x07, 0xa6,
	0xf3, 0x71, 0x37, 0xb6, 0xff, 0xc4, 0xdb, 0x32, 0xcd, 0x52, 0x4e, 0x18, 0x04, 0xce, 0xd0, 0x19,
	0xdd, 0x49, 0xee, 0x99, 0xc3, 0x23, 0xc2, 0xc0, 0x07, 0x6f, 0x7b, 0x7d, 0xe4, 0xc0, 0x1d, 0x3a,
	0xa3, 0xed, 0xf1, 0x4b, 0xd4, 0xb7, 0xc8, 0x36, 0x27, 0xb2, 0xdd, 0x3e, 0x9c, 0x95, 0x70, 0xc0,
	0x6b, 0xb6, 0x7e, 0x92, 0x6c, 0xc1, 0xe5, 0x4f, 0xff, 0x99, 0x77, 0xdb, 0x5c, 0x5d, 0x30, 0x18,
	0x3a, 0xa3, 0xbb, 0xe3, 0x5d, 0xd3, 0xc0, 0x24, 0x47, 0xc7, 0xaa, 0xa2, 0xbc, 0x98, 0x91, 0x45,
	0x0d, 0x89, 0x65, 0xfb, 0x47, 0xde, 0xfd, 0xd5, 0x80, 0xa7, 0x00, 0x79, 0x4a, 0x15, 0x30, 0x19,
	0x6c, 0x0c, 0x07, 0xd7, 0xba, 0xf8, 0x56, 0xf9, 0x06, 0x20, 0x7f, 0xdb, 0xe8, 0xfc, 0x4f, 0xde,
	0x66, 0x77, 0x9f, 0xc1, 0xad, 0x36, 0xe8, 0xf4, 0xa6, 0x41, 0xf5, 0x5a, 0x5f, 0xb7, 0xe2, 0xf5,
	0xc4, 0x6b, 0xa5, 0x44, 0xfb, 0x47, 0xdf, 0x9d, 0x8b, 0xf8, 0x9b, 0xe3, 0x3d, 0x5d, 0x99, 0x6a,
	0x54, 0x52, 0x89, 0x32, 0xc1, 0x70, 0xef, 0xcd, 0xbd, 0xcf, 0x6a, 0xa9, 0x04, 0x83, 0x4a, 0xe2,
	0xaf, 0x06, 0x9e, 0xdb, 0x7f, 0xff, 0x5f, 0x7a, 0x43, 0xea, 0x7d, 0x16, 0xe7, 0x93, 0x1f, 0xae,
	0xb7, 0x9f, 0x09, 0x86, 0xae, 0x7d, 0x18, 0x93, 0x87, 0x7d, 0x03, 0x4d, 0x9b, 0xe5, 0x4e, 0x9d,
	0x8f, 0xef, 0xb4, 0x47, 0x21, 0x16, 0x84, 0x17, 0x48, 0x54, 0x05, 0x2e, 0x80, 0xb7, 0xab, 0xc7,
	0xab, 0x6c, 0x57, 0xbc, 0xdf, 0xe7, 0x16, 0xfd, 0x72, 0x07, 0x87, 0x71, 0xfc, 0xdb, 0xdd, 0x3b,
	0xec, 0x2c, 0xe3, 0x5c, 0xa2, 0x0e, 0x36, 0x68, 0x16, 0xa2, 0xc4, 0x30, 0xff, 0x18, 0xce, 0x3c,
	0xce, 0xe5, 0xdc, 0x72, 0xe6, 0xb3, 0x70, 0x6e, 0x39, 0x17, 0xee, 0x7e, 0x57, 0x88, 0xa2, 0x38,
	0x97, 0x51, 0x64, 0x59, 0x51, 0x34, 0x0b, 0xa3, 0xc8, 0xf2, 0x4e, 0x36, 0xdb, 0x61, 0xc3, 0xbf,
	0x01, 0x00, 0x00, 0xff, 0xff, 0x13, 0x85, 0xc3, 0xef, 0x6b, 0x04, 0x00, 0x00,
}
