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

package resources

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	_ "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

// Use topics to target or exclude placements in the Google Display Network
// based on the category into which the placement falls (for example,
// "Pets & Animals/Pets/Dogs").
type TopicConstant struct {
	// Output only. The resource name of the topic constant.
	// topic constant resource names have the form:
	//
	// `topicConstants/{topic_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// Output only. The ID of the topic.
	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
	// Output only. Resource name of parent of the topic constant.
	TopicConstantParent *wrappers.StringValue `protobuf:"bytes,3,opt,name=topic_constant_parent,json=topicConstantParent,proto3" json:"topic_constant_parent,omitempty"`
	// Output only. The category to target or exclude. Each subsequent element in the array
	// describes a more specific sub-category. For example,
	// {"Pets & Animals", "Pets", "Dogs"} represents the
	// "Pets & Animals/Pets/Dogs" category. List of available topic categories at
	// https://developers.google.com/adwords/api/docs/appendix/verticals
	Path                 []*wrappers.StringValue `protobuf:"bytes,4,rep,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_TopicConstant proto.InternalMessageInfo

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

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

func (m *TopicConstant) GetTopicConstantParent() *wrappers.StringValue {
	if m != nil {
		return m.TopicConstantParent
	}
	return nil
}

func (m *TopicConstant) GetPath() []*wrappers.StringValue {
	if m != nil {
		return m.Path
	}
	return nil
}

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

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

var fileDescriptor_87af0f21f4e047c9 = []byte{
	// 433 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0xcf, 0x6a, 0xd4, 0x40,
	0x1c, 0x26, 0x49, 0x11, 0x1c, 0xed, 0x25, 0x22, 0xac, 0xb5, 0xd8, 0xad, 0x50, 0xd9, 0xd3, 0x8c,
	0x18, 0xed, 0x61, 0x3c, 0xcd, 0x7a, 0x28, 0x15, 0x91, 0x65, 0x2b, 0x39, 0x48, 0x20, 0xcc, 0x66,
	0xa6, 0xe9, 0x40, 0x32, 0x33, 0xcc, 0xcc, 0xae, 0x07, 0x11, 0x7c, 0x12, 0x0f, 0x1e, 0x7d, 0x14,
	0x9f, 0xa2, 0xe7, 0x3e, 0x82, 0x17, 0x25, 0xc9, 0x24, 0xdd, 0x20, 0x58, 0x7b, 0xfb, 0xc2, 0xf7,
	0xf7, 0x17, 0x06, 0x1c, 0x97, 0x4a, 0x95, 0x15, 0x47, 0x94, 0x59, 0xd4, 0xc1, 0x06, 0x6d, 0x12,
	0x64, 0xb8, 0x55, 0x6b, 0x53, 0x70, 0x8b, 0x9c, 0xd2, 0xa2, 0xc8, 0x0b, 0x25, 0xad, 0xa3, 0xd2,
	0x41, 0x6d, 0x94, 0x53, 0xf1, 0x61, 0x27, 0x86, 0x94, 0x59, 0x38, 0xf8, 0xe0, 0x26, 0x81, 0x83,
	0x6f, 0xef, 0xa0, 0x8f, 0xd6, 0x02, 0x9d, 0x0b, 0x5e, 0xb1, 0x7c, 0xc5, 0x2f, 0xe8, 0x46, 0x28,
	0xd3, 0x65, 0xec, 0x3d, 0xda, 0x12, 0xf4, 0x36, 0x4f, 0x3d, 0xf1, 0x54, 0xfb, 0xb5, 0x5a, 0x9f,
	0xa3, 0x4f, 0x86, 0x6a, 0xcd, 0x8d, 0xf5, 0xfc, 0xfe, 0x96, 0x95, 0x4a, 0xa9, 0x1c, 0x75, 0x42,
	0x49, 0xcf, 0x3e, 0xfd, 0x16, 0x81, 0xdd, 0x0f, 0xcd, 0xea, 0x37, 0x7e, 0x74, 0x7c, 0x06, 0x76,
	0xfb, 0x86, 0x5c, 0xd2, 0x9a, 0x4f, 0x82, 0x69, 0x30, 0xbb, 0x3b, 0x87, 0x97, 0x24, 0xfa, 0x45,
	0x66, 0xe0, 0xd9, 0xf5, 0x09, 0x1e, 0x69, 0x61, 0x61, 0xa1, 0x6a, 0x34, 0x8a, 0x59, 0xde, 0xef,
	0x43, 0xde, 0xd3, 0x9a, 0xc7, 0xcf, 0x41, 0x28, 0xd8, 0x24, 0x9c, 0x06, 0xb3, 0x7b, 0x2f, 0x1e,
	0x7b, 0x23, 0xec, 0x17, 0xc3, 0x53, 0xe9, 0x8e, 0x5f, 0xa6, 0xb4, 0x5a, 0xf3, 0x79, 0x74, 0x49,
	0xa2, 0x65, 0x28, 0x58, 0xfc, 0x35, 0x00, 0x0f, 0xc7, 0xbf, 0x33, 0xd7, 0xd4, 0x70, 0xe9, 0x26,
	0x51, 0x9b, 0xb2, 0xff, 0x57, 0xca, 0x99, 0x33, 0x42, 0x96, 0x5d, 0xcc, 0x6d, 0xd7, 0x3e, 0x70,
	0xdb, 0x9f, 0x8b, 0xb6, 0x28, 0x7e, 0x05, 0x76, 0x34, 0x75, 0x17, 0x93, 0x9d, 0x69, 0x74, 0x63,
	0x61, 0xbb, 0xbb, 0x95, 0xe3, 0x77, 0x57, 0xe4, 0xf4, 0x7f, 0x8b, 0xe3, 0x83, 0x51, 0xb1, 0x45,
	0x9f, 0xc7, 0x37, 0x7f, 0x99, 0xff, 0x0e, 0xc0, 0x51, 0xa1, 0x6a, 0x78, 0xe3, 0x23, 0x9a, 0xc7,
	0xa3, 0xe4, 0x45, 0xb3, 0x72, 0x11, 0x7c, 0x7c, 0xeb, 0x8d, 0xa5, 0xaa, 0xa8, 0x2c, 0xa1, 0x32,
	0x25, 0x2a, 0xb9, 0x6c, 0x6f, 0x40, 0xd7, 0xcb, 0xfe, 0xf1, 0xa8, 0x5f, 0x0f, 0xe8, 0x7b, 0x18,
	0x9d, 0x10, 0xf2, 0x23, 0x3c, 0x3c, 0xe9, 0x22, 0x09, 0xb3, 0xb0, 0x83, 0x0d, 0x4a, 0x13, 0xb8,
	0xec, 0x95, 0x3f, 0x7b, 0x4d, 0x46, 0x98, 0xcd, 0x06, 0x4d, 0x96, 0x26, 0xd9, 0xa0, 0xb9, 0x0a,
	0x8f, 0x3a, 0x02, 0x63, 0xc2, 0x2c, 0xc6, 0x83, 0x0a, 0xe3, 0x34, 0xc1, 0x78, 0xd0, 0xad, 0xee,
	0xb4, 0x63, 0x93, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x8e, 0x84, 0xde, 0x80, 0x03, 0x00,
	0x00,
}
