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

package common

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

// The operator.
type TargetRestrictionOperation_Operator int32

const (
	// Unspecified.
	TargetRestrictionOperation_UNSPECIFIED TargetRestrictionOperation_Operator = 0
	// Used for return value only. Represents value unknown in this version.
	TargetRestrictionOperation_UNKNOWN TargetRestrictionOperation_Operator = 1
	// Add the restriction to the existing restrictions.
	TargetRestrictionOperation_ADD TargetRestrictionOperation_Operator = 2
	// Remove the restriction from the existing restrictions.
	TargetRestrictionOperation_REMOVE TargetRestrictionOperation_Operator = 3
)

var TargetRestrictionOperation_Operator_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "ADD",
	3: "REMOVE",
}

var TargetRestrictionOperation_Operator_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"ADD":         2,
	"REMOVE":      3,
}

func (x TargetRestrictionOperation_Operator) String() string {
	return proto.EnumName(TargetRestrictionOperation_Operator_name, int32(x))
}

func (TargetRestrictionOperation_Operator) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa7d412c2ce6d703, []int{2, 0}
}

// Settings for the targeting-related features, at the campaign and ad group
// levels. For more details about the targeting setting, visit
// https://support.google.com/google-ads/answer/7365594
type TargetingSetting struct {
	// The per-targeting-dimension setting to restrict the reach of your campaign
	// or ad group.
	TargetRestrictions []*TargetRestriction `protobuf:"bytes,1,rep,name=target_restrictions,json=targetRestrictions,proto3" json:"target_restrictions,omitempty"`
	// The list of operations changing the target restrictions.
	//
	// Adding a target restriction with a targeting dimension that already exists
	// causes the existing target restriction to be replaced with the new value.
	TargetRestrictionOperations []*TargetRestrictionOperation `protobuf:"bytes,2,rep,name=target_restriction_operations,json=targetRestrictionOperations,proto3" json:"target_restriction_operations,omitempty"`
	XXX_NoUnkeyedLiteral        struct{}                      `json:"-"`
	XXX_unrecognized            []byte                        `json:"-"`
	XXX_sizecache               int32                         `json:"-"`
}

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

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

var xxx_messageInfo_TargetingSetting proto.InternalMessageInfo

func (m *TargetingSetting) GetTargetRestrictions() []*TargetRestriction {
	if m != nil {
		return m.TargetRestrictions
	}
	return nil
}

func (m *TargetingSetting) GetTargetRestrictionOperations() []*TargetRestrictionOperation {
	if m != nil {
		return m.TargetRestrictionOperations
	}
	return nil
}

// The list of per-targeting-dimension targeting settings.
type TargetRestriction struct {
	// The targeting dimension that these settings apply to.
	TargetingDimension enums.TargetingDimensionEnum_TargetingDimension `protobuf:"varint,1,opt,name=targeting_dimension,json=targetingDimension,proto3,enum=google.ads.googleads.v3.enums.TargetingDimensionEnum_TargetingDimension" json:"targeting_dimension,omitempty"`
	// Indicates whether to restrict your ads to show only for the criteria you
	// have selected for this targeting_dimension, or to target all values for
	// this targeting_dimension and show ads based on your targeting in other
	// TargetingDimensions. A value of `true` means that these criteria will only
	// apply bid modifiers, and not affect targeting. A value of `false` means
	// that these criteria will restrict targeting as well as applying bid
	// modifiers.
	BidOnly              *wrappers.BoolValue `protobuf:"bytes,2,opt,name=bid_only,json=bidOnly,proto3" json:"bid_only,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *TargetRestriction) Reset()         { *m = TargetRestriction{} }
func (m *TargetRestriction) String() string { return proto.CompactTextString(m) }
func (*TargetRestriction) ProtoMessage()    {}
func (*TargetRestriction) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa7d412c2ce6d703, []int{1}
}

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

var xxx_messageInfo_TargetRestriction proto.InternalMessageInfo

func (m *TargetRestriction) GetTargetingDimension() enums.TargetingDimensionEnum_TargetingDimension {
	if m != nil {
		return m.TargetingDimension
	}
	return enums.TargetingDimensionEnum_UNSPECIFIED
}

func (m *TargetRestriction) GetBidOnly() *wrappers.BoolValue {
	if m != nil {
		return m.BidOnly
	}
	return nil
}

// Operation to be performed on a target restriction list in a mutate.
type TargetRestrictionOperation struct {
	// Type of list operation to perform.
	Operator TargetRestrictionOperation_Operator `protobuf:"varint,1,opt,name=operator,proto3,enum=google.ads.googleads.v3.common.TargetRestrictionOperation_Operator" json:"operator,omitempty"`
	// The target restriction being added to or removed from the list.
	Value                *TargetRestriction `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *TargetRestrictionOperation) Reset()         { *m = TargetRestrictionOperation{} }
func (m *TargetRestrictionOperation) String() string { return proto.CompactTextString(m) }
func (*TargetRestrictionOperation) ProtoMessage()    {}
func (*TargetRestrictionOperation) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa7d412c2ce6d703, []int{2}
}

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

var xxx_messageInfo_TargetRestrictionOperation proto.InternalMessageInfo

func (m *TargetRestrictionOperation) GetOperator() TargetRestrictionOperation_Operator {
	if m != nil {
		return m.Operator
	}
	return TargetRestrictionOperation_UNSPECIFIED
}

func (m *TargetRestrictionOperation) GetValue() *TargetRestriction {
	if m != nil {
		return m.Value
	}
	return nil
}

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.common.TargetRestrictionOperation_Operator", TargetRestrictionOperation_Operator_name, TargetRestrictionOperation_Operator_value)
	proto.RegisterType((*TargetingSetting)(nil), "google.ads.googleads.v3.common.TargetingSetting")
	proto.RegisterType((*TargetRestriction)(nil), "google.ads.googleads.v3.common.TargetRestriction")
	proto.RegisterType((*TargetRestrictionOperation)(nil), "google.ads.googleads.v3.common.TargetRestrictionOperation")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/common/targeting_setting.proto", fileDescriptor_fa7d412c2ce6d703)
}

var fileDescriptor_fa7d412c2ce6d703 = []byte{
	// 515 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x53, 0x41, 0x8f, 0x93, 0x40,
	0x18, 0x15, 0x1a, 0xb7, 0xcd, 0x34, 0x51, 0x1c, 0x63, 0xd2, 0x54, 0xdd, 0x34, 0x9c, 0x7a, 0x1a,
	0x62, 0x89, 0x9a, 0x60, 0x3c, 0xd0, 0x82, 0x75, 0x63, 0x2c, 0x0d, 0xeb, 0x62, 0x62, 0x9a, 0x10,
	0x28, 0x23, 0x21, 0x81, 0x19, 0xc2, 0xd0, 0x9a, 0x5e, 0xbc, 0xf9, 0x47, 0x3c, 0xfa, 0x3f, 0xbc,
	0xf8, 0x53, 0x3c, 0x79, 0xf2, 0x6c, 0x60, 0x18, 0x5c, 0x77, 0x45, 0xb3, 0x7b, 0xe2, 0xe3, 0x9b,
	0xf7, 0xde, 0xf7, 0xe6, 0xcd, 0x0c, 0x78, 0x12, 0x53, 0x1a, 0xa7, 0x58, 0x0b, 0x22, 0xa6, 0xf1,
	0xb2, 0xaa, 0xf6, 0xba, 0xb6, 0xa5, 0x59, 0x46, 0x89, 0x56, 0x06, 0x45, 0x8c, 0xcb, 0x84, 0xc4,
	0x3e, 0xc3, 0x65, 0xf5, 0x45, 0x79, 0x41, 0x4b, 0x0a, 0x8f, 0x39, 0x18, 0x05, 0x11, 0x43, 0x2d,
	0x0f, 0xed, 0x75, 0xc4, 0x79, 0xe3, 0xa7, 0x5d, 0xba, 0x98, 0xec, 0x32, 0x76, 0x4e, 0x36, 0x4a,
	0x32, 0x4c, 0x58, 0x42, 0x09, 0x17, 0x1e, 0x37, 0xc2, 0x5a, 0xfd, 0x17, 0xee, 0xde, 0x6b, 0x1f,
	0x8a, 0x20, 0xcf, 0x71, 0xc1, 0x9a, 0xf5, 0x07, 0x42, 0x38, 0x4f, 0xb4, 0x80, 0x10, 0x5a, 0x06,
	0x65, 0x42, 0x49, 0xb3, 0xaa, 0xfe, 0x94, 0x80, 0xf2, 0x46, 0x68, 0x9f, 0x72, 0xc7, 0x30, 0x04,
	0x77, 0xf9, 0x3c, 0xbf, 0xc0, 0xac, 0x2c, 0x92, 0x6d, 0xcd, 0x18, 0x49, 0x93, 0xde, 0x74, 0x38,
	0x7b, 0x84, 0xfe, 0xbd, 0x13, 0xc4, 0xe5, 0xdc, 0xdf, 0x4c, 0x17, 0x96, 0x17, 0x5b, 0x0c, 0x7e,
	0x04, 0x0f, 0x2f, 0xcf, 0xf0, 0x69, 0x8e, 0x0b, 0xee, 0x6f, 0x24, 0xd7, 0xd3, 0x8c, 0x2b, 0x4f,
	0x73, 0x84, 0x84, 0x7b, 0xbf, 0xec, 0x5c, 0x63, 0xea, 0x57, 0x09, 0xdc, 0xb9, 0xc4, 0x85, 0x07,
	0xb1, 0xf3, 0x3f, 0x92, 0x1e, 0x49, 0x13, 0x69, 0x7a, 0x6b, 0xf6, 0xb2, 0xd3, 0x4b, 0x7d, 0x46,
	0xa8, 0xcd, 0xd1, 0x12, 0x44, 0x9b, 0xec, 0xb2, 0xbf, 0xb4, 0x45, 0x20, 0xe7, 0x7b, 0xf0, 0x31,
	0x18, 0x84, 0x49, 0xe4, 0x53, 0x92, 0x1e, 0x46, 0xf2, 0x44, 0x9a, 0x0e, 0x67, 0x63, 0x31, 0x4f,
	0x1c, 0x2d, 0x9a, 0x53, 0x9a, 0x7a, 0x41, 0xba, 0xc3, 0x6e, 0x3f, 0x4c, 0x22, 0x87, 0xa4, 0x07,
	0xf5, 0x93, 0x0c, 0xc6, 0xdd, 0x19, 0x40, 0x1f, 0x0c, 0x78, 0xa6, 0xb4, 0x68, 0x76, 0xb1, 0xb8,
	0x7e, 0xa2, 0xc8, 0x69, 0xa4, 0xdc, 0x56, 0x14, 0x2e, 0xc1, 0xcd, 0x7d, 0xe5, 0xa8, 0xf1, 0x7c,
	0x8d, 0xdb, 0xc1, 0xf9, 0xea, 0x73, 0x30, 0x10, 0xf2, 0xf0, 0x36, 0x18, 0x9e, 0xad, 0x4e, 0xd7,
	0xf6, 0xe2, 0xe4, 0xc5, 0x89, 0x6d, 0x29, 0x37, 0xe0, 0x10, 0xf4, 0xcf, 0x56, 0xaf, 0x56, 0xce,
	0xdb, 0x95, 0x22, 0xc1, 0x3e, 0xe8, 0x99, 0x96, 0xa5, 0xc8, 0x10, 0x80, 0x23, 0xd7, 0x7e, 0xed,
	0x78, 0xb6, 0xd2, 0x9b, 0xff, 0x90, 0x80, 0xba, 0xa5, 0xd9, 0x7f, 0xc6, 0xcf, 0xef, 0x5d, 0xbc,
	0xec, 0xeb, 0x2a, 0xdb, 0xb5, 0xf4, 0xce, 0x6a, 0x88, 0x31, 0x4d, 0x03, 0x12, 0x23, 0x5a, 0xc4,
	0x5a, 0x8c, 0x49, 0x9d, 0xbc, 0x78, 0x8f, 0x79, 0xc2, 0xba, 0x9e, 0xfd, 0x33, 0xfe, 0xf9, 0x2c,
	0xf7, 0x96, 0xa6, 0xf9, 0x45, 0x3e, 0x5e, 0x72, 0x31, 0x33, 0x62, 0x88, 0x97, 0x55, 0xe5, 0xe9,
	0x68, 0x51, 0xc3, 0xbe, 0x09, 0xc0, 0xc6, 0x8c, 0xd8, 0xa6, 0x05, 0x6c, 0x3c, 0x7d, 0xc3, 0x01,
	0xdf, 0x65, 0x95, 0x77, 0x0d, 0xc3, 0x8c, 0x98, 0x61, 0xb4, 0x10, 0xc3, 0xf0, 0x74, 0xc3, 0xe0,
	0xa0, 0xf0, 0xa8, 0x76, 0xa7, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x05, 0xf9, 0xc5, 0xc5, 0x93,
	0x04, 0x00, 0x00,
}
