// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/resources/ad_group_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

// An ad group extension setting.
type AdGroupExtensionSetting struct {
	// The resource name of the ad group extension setting.
	// AdGroupExtensionSetting resource names have the form:
	//
	// `customers/{customer_id}/adGroupExtensionSettings/{ad_group_id}~{extension_type}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The extension type of the ad group 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 ad group. The linked extension feed items will
	// serve under this ad group.
	// AdGroup resource names have the form:
	//
	// `customers/{customer_id}/adGroups/{ad_group_id}`
	AdGroup *wrappers.StringValue `protobuf:"bytes,3,opt,name=ad_group,json=adGroup,proto3" json:"ad_group,omitempty"`
	// The resource names of the extension feed items to serve under the ad group.
	// 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 *AdGroupExtensionSetting) Reset()         { *m = AdGroupExtensionSetting{} }
func (m *AdGroupExtensionSetting) String() string { return proto.CompactTextString(m) }
func (*AdGroupExtensionSetting) ProtoMessage()    {}
func (*AdGroupExtensionSetting) Descriptor() ([]byte, []int) {
	return fileDescriptor_5bcbdad332356d2f, []int{0}
}

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

var xxx_messageInfo_AdGroupExtensionSetting proto.InternalMessageInfo

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

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

func (m *AdGroupExtensionSetting) GetAdGroup() *wrappers.StringValue {
	if m != nil {
		return m.AdGroup
	}
	return nil
}

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

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

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

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

var fileDescriptor_5bcbdad332356d2f = []byte{
	// 496 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x41, 0x6b, 0xd4, 0x40,
	0x14, 0x26, 0xbb, 0xb5, 0x6a, 0xb4, 0x3d, 0x04, 0xc1, 0x58, 0x16, 0xd9, 0x2a, 0x85, 0x3d, 0xcd,
	0xc8, 0xe6, 0x20, 0x44, 0x11, 0xb2, 0x58, 0x17, 0x7b, 0x28, 0x4b, 0x2a, 0x7b, 0x90, 0x85, 0x30,
	0xcd, 0xbc, 0xc6, 0xc0, 0x66, 0x26, 0xcc, 0x4c, 0x56, 0x4b, 0xa9, 0xe0, 0xd1, 0xff, 0xe0, 0xc9,
	0xa3, 0x3f, 0xc5, 0x9f, 0xd2, 0x5f, 0x21, 0xc9, 0x64, 0x66, 0xbb, 0x68, 0x6c, 0x6f, 0xdf, 0xcc,
	0xfb, 0xbe, 0xef, 0xbd, 0xef, 0x0d, 0xe3, 0x4e, 0x32, 0xce, 0xb3, 0x25, 0x60, 0x42, 0x25, 0xd6,
	0xb0, 0x46, 0xab, 0x00, 0x0b, 0x90, 0xbc, 0x12, 0x29, 0x48, 0x4c, 0x68, 0x92, 0x09, 0x5e, 0x95,
	0x09, 0x7c, 0x51, 0xc0, 0x64, 0xce, 0x59, 0x22, 0x41, 0xa9, 0x9c, 0x65, 0xa8, 0x14, 0x5c, 0x71,
	0x6f, 0x5f, 0x0b, 0x11, 0xa1, 0x12, 0x59, 0x0f, 0xb4, 0x0a, 0x90, 0xf5, 0xd8, 0x7b, 0xdd, 0xd5,
	0x06, 0x58, 0x55, 0x48, 0xfc, 0x97, 0x73, 0x42, 0x61, 0x95, 0xa7, 0xa0, 0x1b, 0xec, 0x8d, 0x6f,
	0xab, 0x56, 0xe7, 0xa5, 0xd1, 0x3c, 0x31, 0x9a, 0x32, 0xb7, 0x59, 0xda, 0xd2, 0xd3, 0xb6, 0xd4,
	0x9c, 0x4e, 0xab, 0x33, 0xfc, 0x59, 0x90, 0xb2, 0x04, 0x21, 0xdb, 0xfa, 0xe0, 0x9a, 0x94, 0x30,
	0xc6, 0x15, 0x51, 0x39, 0x67, 0x6d, 0xf5, 0xd9, 0x8f, 0x2d, 0xf7, 0x71, 0x44, 0xa7, 0xf5, 0x46,
	0x0e, 0x4d, 0xe3, 0x13, 0x3d, 0xb5, 0xf7, 0xdc, 0xdd, 0x31, 0xbd, 0x12, 0x46, 0x0a, 0xf0, 0x9d,
	0xa1, 0x33, 0xba, 0x1f, 0x3f, 0x34, 0x97, 0xc7, 0xa4, 0x00, 0x0f, 0xdc, 0xdd, 0xcd, 0x89, 0xfd,
	0xde, 0xd0, 0x19, 0xed, 0x8e, 0xdf, 0xa0, 0xae, 0x3d, 0x36, 0x31, 0x91, 0xed, 0xf6, 0xe1, 0xbc,
	0x84, 0x43, 0x56, 0x15, 0x9b, 0x37, 0xf1, 0x0e, 0x5c, 0x3f, 0x7a, 0x2f, 0xdd, 0x7b, 0xe6, 0xe5,
	0xfc, 0xfe, 0xd0, 0x19, 0x3d, 0x18, 0x0f, 0x4c, 0x03, 0x13, 0x1c, 0x9d, 0x28, 0x91, 0xb3, 0x6c,
	0x4e, 0x96, 0x15, 0xc4, 0x77, 0x89, 0x0e, 0xe5, 0x1d, 0xbb, 0x8f, 0xd6, 0xf3, 0x9d, 0x01, 0xd0,
	0x24, 0x57, 0x50, 0x48, 0x7f, 0x6b, 0xd8, 0xbf, 0xd1, 0xc4, 0xb3, 0xca, 0x77, 0x00, 0xf4, 0x7d,
	0xad, 0xf3, 0x3e, 0xb9, 0xdb, 0xfa, 0x35, 0xfd, 0x3b, 0x4d, 0xce, 0xd9, 0x6d, 0x73, 0xb6, 0x5b,
	0x7d, 0xdb, 0x88, 0x37, 0x03, 0x6f, 0x94, 0xe2, 0xd6, 0x3f, 0xfc, 0xe6, 0x5c, 0x45, 0x5f, 0xdd,
	0x17, 0x6b, 0xcf, 0x16, 0x95, 0xb9, 0x44, 0x29, 0x2f, 0x70, 0xd7, 0xb3, 0x1d, 0xa5, 0x95, 0x54,
	0xbc, 0x00, 0x21, 0xf1, 0x85, 0x81, 0x97, 0x98, 0xfc, 0x9b, 0x2d, 0xf1, 0x45, 0xf7, 0x8f, 0xb8,
	0x9c, 0x7c, 0xef, 0xb9, 0x07, 0x29, 0x2f, 0xd0, 0x8d, 0x7f, 0x62, 0x32, 0xe8, 0x18, 0x67, 0x56,
	0x2f, 0x76, 0xe6, 0x7c, 0x3c, 0x6a, 0x2d, 0x32, 0xbe, 0x24, 0x2c, 0x43, 0x5c, 0x64, 0x38, 0x03,
	0xd6, 0xac, 0x1d, 0xaf, 0x83, 0xfd, 0xe7, 0xe7, 0xbe, 0xb2, 0xe8, 0x67, 0xaf, 0x3f, 0x8d, 0xa2,
	0x5f, 0xbd, 0xfd, 0xa9, 0xb6, 0x8c, 0xa8, 0x44, 0x1a, 0xd6, 0x68, 0x1e, 0xa0, 0xd8, 0x30, 0x7f,
	0x1b, 0xce, 0x22, 0xa2, 0x72, 0x61, 0x39, 0x8b, 0x79, 0xb0, 0xb0, 0x9c, 0xab, 0xde, 0x81, 0x2e,
	0x84, 0x61, 0x44, 0x65, 0x18, 0x5a, 0x56, 0x18, 0xce, 0x83, 0x30, 0xb4, 0xbc, 0xd3, 0xed, 0x66,
	0xd8, 0xe0, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe8, 0x43, 0xd1, 0xd8, 0x65, 0x04, 0x00, 0x00,
}
