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

package resources

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "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 view.
type KeywordView struct {
	// The resource name of the keyword view.
	// Keyword view resource names have the form:
	//
	// `customers/{customer_id}/keywordViews/{ad_group_id}~{criterion_id}`
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_KeywordView proto.InternalMessageInfo

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

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

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

var fileDescriptor_b4b06c74ce279f21 = []byte{
	// 315 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xc1, 0x4a, 0x33, 0x31,
	0x14, 0x85, 0x99, 0xfe, 0xf0, 0x83, 0xa3, 0x82, 0x74, 0xa5, 0xc5, 0x85, 0x55, 0x0b, 0xae, 0x12,
	0x61, 0x5c, 0xc5, 0x55, 0xba, 0x29, 0x28, 0x48, 0xe9, 0x62, 0x10, 0x1d, 0x28, 0x71, 0x12, 0xc2,
	0x60, 0x27, 0xb7, 0xe4, 0x4e, 0x5b, 0xa4, 0xf4, 0x19, 0x7c, 0x07, 0x97, 0x3e, 0x8a, 0x8f, 0xd2,
	0x77, 0x10, 0x64, 0x9a, 0x26, 0x9d, 0x95, 0xee, 0x0e, 0xb9, 0xdf, 0x39, 0xf7, 0x1e, 0x12, 0xdf,
	0x68, 0x00, 0x3d, 0x51, 0x54, 0x48, 0xa4, 0x4e, 0xd6, 0x6a, 0x9e, 0x50, 0xab, 0x10, 0x66, 0x36,
	0x57, 0x48, 0x5f, 0xd5, 0xdb, 0x02, 0xac, 0x1c, 0xcf, 0x0b, 0xb5, 0x20, 0x53, 0x0b, 0x15, 0xb4,
	0xbb, 0x0e, 0x25, 0x42, 0x22, 0x09, 0x2e, 0x32, 0x4f, 0x48, 0x70, 0x75, 0x4e, 0x7c, 0xf0, 0xb4,
	0x08, 0x59, 0xce, 0xdd, 0x39, 0x6d, 0x8c, 0x84, 0x31, 0x50, 0x89, 0xaa, 0x00, 0x83, 0x6e, 0x7a,
	0xfe, 0x1e, 0xc5, 0xfb, 0xf7, 0x6e, 0x65, 0x5a, 0xa8, 0x45, 0xfb, 0x22, 0x3e, 0xf4, 0xfe, 0xb1,
	0x11, 0xa5, 0x3a, 0x8e, 0xce, 0xa2, 0xab, 0xbd, 0xd1, 0x81, 0x7f, 0x7c, 0x10, 0xa5, 0x62, 0xcf,
	0x6b, 0xfe, 0x18, 0x5f, 0xee, 0x4e, 0xd9, 0xaa, 0x69, 0x81, 0x24, 0x87, 0x92, 0x36, 0xf3, 0xae,
	0xf3, 0x19, 0x56, 0x50, 0x2a, 0x8b, 0x74, 0xe9, 0xe5, 0xca, 0x97, 0xac, 0x09, 0xa4, 0xcb, 0x66,
	0xe5, 0x55, 0xff, 0x3b, 0x8a, 0x7b, 0x39, 0x94, 0xe4, 0xcf, 0xd2, 0xfd, 0xa3, 0xc6, 0xa2, 0x61,
	0xdd, 0x66, 0x18, 0x3d, 0xdd, 0x6d, 0x6d, 0x1a, 0x26, 0xc2, 0x68, 0x02, 0x56, 0x53, 0xad, 0xcc,
	0xa6, 0x2b, 0xdd, 0x9d, 0xf9, 0xcb, 0x07, 0xdc, 0x06, 0xf5, 0xd1, 0xfa, 0x37, 0xe0, 0xfc, 0xb3,
	0xd5, 0x1d, 0xb8, 0x48, 0x2e, 0x91, 0x38, 0x59, 0xab, 0x34, 0x21, 0x23, 0x4f, 0x7e, 0x79, 0x26,
	0xe3, 0x12, 0xb3, 0xc0, 0x64, 0x69, 0x92, 0x05, 0x66, 0xdd, 0xea, 0xb9, 0x01, 0x63, 0x5c, 0x22,
	0x63, 0x81, 0x62, 0x2c, 0x4d, 0x18, 0x0b, 0xdc, 0xcb, 0xff, 0xcd, 0xb1, 0xc9, 0x4f, 0x00, 0x00,
	0x00, 0xff, 0xff, 0x5b, 0xbd, 0xec, 0x85, 0x2c, 0x02, 0x00, 0x00,
}
