// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/resources/keyword_plan_keyword.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 Keyword Plan ad group keyword.
// Max number of keyword plan keywords per plan: 2500.
type KeywordPlanKeyword struct {
	// The resource name of the Keyword Plan ad group keyword.
	// KeywordPlanKeyword resource names have the form:
	//
	// `customers/{customer_id}/keywordPlanKeywords/{kp_ad_group_keyword_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The Keyword Plan ad group to which this keyword belongs.
	KeywordPlanAdGroup *wrappers.StringValue `protobuf:"bytes,2,opt,name=keyword_plan_ad_group,json=keywordPlanAdGroup,proto3" json:"keyword_plan_ad_group,omitempty"`
	// The ID of the Keyword Plan keyword.
	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
	// The keyword text.
	Text *wrappers.StringValue `protobuf:"bytes,4,opt,name=text,proto3" json:"text,omitempty"`
	// The keyword match type.
	MatchType enums.KeywordMatchTypeEnum_KeywordMatchType `protobuf:"varint,5,opt,name=match_type,json=matchType,proto3,enum=google.ads.googleads.v3.enums.KeywordMatchTypeEnum_KeywordMatchType" json:"match_type,omitempty"`
	// A keyword level max cpc bid in micros, in the account currency, that
	// overrides the keyword plan ad group cpc bid.
	CpcBidMicros         *wrappers.Int64Value `protobuf:"bytes,6,opt,name=cpc_bid_micros,json=cpcBidMicros,proto3" json:"cpc_bid_micros,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_KeywordPlanKeyword proto.InternalMessageInfo

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

func (m *KeywordPlanKeyword) GetKeywordPlanAdGroup() *wrappers.StringValue {
	if m != nil {
		return m.KeywordPlanAdGroup
	}
	return nil
}

func (m *KeywordPlanKeyword) GetId() *wrappers.Int64Value {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *KeywordPlanKeyword) GetText() *wrappers.StringValue {
	if m != nil {
		return m.Text
	}
	return nil
}

func (m *KeywordPlanKeyword) GetMatchType() enums.KeywordMatchTypeEnum_KeywordMatchType {
	if m != nil {
		return m.MatchType
	}
	return enums.KeywordMatchTypeEnum_UNSPECIFIED
}

func (m *KeywordPlanKeyword) GetCpcBidMicros() *wrappers.Int64Value {
	if m != nil {
		return m.CpcBidMicros
	}
	return nil
}

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

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

var fileDescriptor_148007907f81fae0 = []byte{
	// 497 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xdd, 0x6a, 0xd4, 0x4c,
	0x18, 0xc7, 0xd9, 0x74, 0xdf, 0x42, 0xe7, 0xad, 0x3d, 0x08, 0x88, 0xb1, 0x16, 0xd9, 0x2a, 0x85,
	0x85, 0xc2, 0x8c, 0x34, 0xd2, 0x83, 0x28, 0x48, 0x16, 0x65, 0x51, 0xa9, 0x2e, 0xab, 0xec, 0x81,
	0x2c, 0x84, 0xd9, 0x99, 0x31, 0x86, 0xcd, 0x7c, 0x38, 0x33, 0x69, 0x5d, 0x4a, 0xcf, 0x7a, 0x25,
	0x1e, 0x7a, 0x29, 0x5e, 0x4a, 0xaf, 0x42, 0x92, 0x4c, 0x12, 0x65, 0x5b, 0xeb, 0xd9, 0x3f, 0xf3,
	0xfc, 0x7f, 0xf3, 0x7c, 0x4d, 0xc0, 0xf3, 0x54, 0xca, 0x34, 0x67, 0x08, 0x53, 0x83, 0x6a, 0x59,
	0xaa, 0xd3, 0x10, 0x69, 0x66, 0x64, 0xa1, 0x09, 0x33, 0x68, 0xc9, 0x56, 0x67, 0x52, 0xd3, 0x44,
	0xe5, 0x58, 0x24, 0xee, 0x03, 0x2a, 0x2d, 0xad, 0xf4, 0xf7, 0x6b, 0x04, 0x62, 0x6a, 0x60, 0x4b,
	0xc3, 0xd3, 0x10, 0xb6, 0xf4, 0xee, 0xf1, 0x4d, 0x09, 0x98, 0x28, 0x78, 0x77, 0x39, 0xc7, 0x96,
	0x7c, 0x49, 0xec, 0x4a, 0xb1, 0xfa, 0xea, 0xdd, 0xfb, 0x0d, 0xa7, 0xb2, 0xb6, 0x16, 0x17, 0x7a,
	0xe8, 0x42, 0xd5, 0xd7, 0xa2, 0xf8, 0x8c, 0xce, 0x34, 0x56, 0x8a, 0x69, 0xe3, 0xe2, 0x7b, 0xbf,
	0xa1, 0x58, 0x08, 0x69, 0xb1, 0xcd, 0xa4, 0x70, 0xd1, 0x47, 0x97, 0x7d, 0xe0, 0xbf, 0xad, 0xb3,
	0x4e, 0x72, 0x2c, 0x9c, 0xf4, 0x1f, 0x83, 0x3b, 0x4d, 0x9a, 0x44, 0x60, 0xce, 0x82, 0xde, 0xa0,
	0x37, 0xdc, 0x9a, 0x6e, 0x37, 0x87, 0xef, 0x30, 0x67, 0xfe, 0x7b, 0x70, 0xf7, 0x8f, 0x69, 0x60,
	0x9a, 0xa4, 0x5a, 0x16, 0x2a, 0xf0, 0x06, 0xbd, 0xe1, 0xff, 0x47, 0x7b, 0x6e, 0x08, 0xb0, 0xa9,
	0x0c, 0x7e, 0xb0, 0x3a, 0x13, 0xe9, 0x0c, 0xe7, 0x05, 0x9b, 0xfa, 0xcb, 0x2e, 0x6b, 0x4c, 0xc7,
	0x25, 0xe7, 0x1f, 0x02, 0x2f, 0xa3, 0xc1, 0x46, 0x45, 0x3f, 0x58, 0xa3, 0x5f, 0x0b, 0x7b, 0xfc,
	0xb4, 0x86, 0xbd, 0x8c, 0xfa, 0x4f, 0x40, 0xdf, 0xb2, 0x6f, 0x36, 0xe8, 0xff, 0x43, 0xb2, 0xca,
	0xe9, 0x13, 0x00, 0xba, 0xc1, 0x06, 0xff, 0x0d, 0x7a, 0xc3, 0x9d, 0xa3, 0x97, 0xf0, 0xa6, 0xa5,
	0x55, 0x1b, 0x81, 0x6e, 0x20, 0x27, 0x25, 0xf7, 0x71, 0xa5, 0xd8, 0x2b, 0x51, 0xf0, 0xb5, 0xc3,
	0xe9, 0x16, 0x6f, 0xa4, 0x1f, 0x83, 0x1d, 0xa2, 0x48, 0xb2, 0xc8, 0x68, 0xc2, 0x33, 0xa2, 0xa5,
	0x09, 0x36, 0x6f, 0xef, 0x67, 0x9b, 0x28, 0x32, 0xca, 0xe8, 0x49, 0x05, 0x44, 0x5f, 0xaf, 0x62,
	0x01, 0x0e, 0xbb, 0x62, 0x9c, 0x52, 0x99, 0x81, 0x44, 0x72, 0x74, 0xcd, 0xba, 0x5e, 0x90, 0xc2,
	0x58, 0xc9, 0x99, 0x36, 0xe8, 0xbc, 0x91, 0x17, 0x68, 0xb9, 0x66, 0x34, 0xe8, 0xfc, 0xba, 0xf7,
	0x7b, 0x31, 0xba, 0xf4, 0xc0, 0x01, 0x91, 0x1c, 0xde, 0xfa, 0x82, 0x47, 0xf7, 0xd6, 0xd3, 0x4f,
	0xca, 0x8e, 0x26, 0xbd, 0x4f, 0x6f, 0x1c, 0x9d, 0xca, 0x1c, 0x8b, 0x14, 0x4a, 0x9d, 0xa2, 0x94,
	0x89, 0xaa, 0x5f, 0xd4, 0xf5, 0xf0, 0x97, 0x9f, 0xeb, 0x59, 0xab, 0xbe, 0x7b, 0x1b, 0xe3, 0x38,
	0xfe, 0xe1, 0xed, 0x8f, 0xeb, 0x2b, 0x63, 0x6a, 0x60, 0x2d, 0x4b, 0x35, 0x0b, 0xe1, 0xb4, 0x71,
	0xfe, 0x6c, 0x3c, 0xf3, 0x98, 0x9a, 0x79, 0xeb, 0x99, 0xcf, 0xc2, 0x79, 0xeb, 0xb9, 0xf2, 0x0e,
	0xea, 0x40, 0x14, 0xc5, 0xd4, 0x44, 0x51, 0xeb, 0x8a, 0xa2, 0x59, 0x18, 0x45, 0xad, 0x6f, 0xb1,
	0x59, 0x15, 0x1b, 0xfe, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x72, 0xf9, 0x4b, 0x08, 0x04, 0x00,
	0x00,
}
