// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/dialogflow/v2/entity_type.proto

package dialogflow

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	empty "github.com/golang/protobuf/ptypes/empty"
	_ "github.com/golang/protobuf/ptypes/struct"
	context "golang.org/x/net/context"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	longrunning "google.golang.org/genproto/googleapis/longrunning"
	field_mask "google.golang.org/genproto/protobuf/field_mask"
	grpc "google.golang.org/grpc"
)

// 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.ProtoPackageIsVersion2 // please upgrade the proto package

// Represents kinds of entities.
type EntityType_Kind int32

const (
	// Not specified. This value should be never used.
	EntityType_KIND_UNSPECIFIED EntityType_Kind = 0
	// Map entity types allow mapping of a group of synonyms to a canonical
	// value.
	EntityType_KIND_MAP EntityType_Kind = 1
	// List entity types contain a set of entries that do not map to canonical
	// values. However, list entity types can contain references to other entity
	// types (with or without aliases).
	EntityType_KIND_LIST EntityType_Kind = 2
)

var EntityType_Kind_name = map[int32]string{
	0: "KIND_UNSPECIFIED",
	1: "KIND_MAP",
	2: "KIND_LIST",
}

var EntityType_Kind_value = map[string]int32{
	"KIND_UNSPECIFIED": 0,
	"KIND_MAP":         1,
	"KIND_LIST":        2,
}

func (x EntityType_Kind) String() string {
	return proto.EnumName(EntityType_Kind_name, int32(x))
}

func (EntityType_Kind) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{0, 0}
}

// Represents different entity type expansion modes. Automated expansion
// allows an agent to recognize values that have not been explicitly listed in
// the entity (for example, new kinds of shopping list items).
type EntityType_AutoExpansionMode int32

const (
	// Auto expansion disabled for the entity.
	EntityType_AUTO_EXPANSION_MODE_UNSPECIFIED EntityType_AutoExpansionMode = 0
	// Allows an agent to recognize values that have not been explicitly
	// listed in the entity.
	EntityType_AUTO_EXPANSION_MODE_DEFAULT EntityType_AutoExpansionMode = 1
)

var EntityType_AutoExpansionMode_name = map[int32]string{
	0: "AUTO_EXPANSION_MODE_UNSPECIFIED",
	1: "AUTO_EXPANSION_MODE_DEFAULT",
}

var EntityType_AutoExpansionMode_value = map[string]int32{
	"AUTO_EXPANSION_MODE_UNSPECIFIED": 0,
	"AUTO_EXPANSION_MODE_DEFAULT":     1,
}

func (x EntityType_AutoExpansionMode) String() string {
	return proto.EnumName(EntityType_AutoExpansionMode_name, int32(x))
}

func (EntityType_AutoExpansionMode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{0, 1}
}

// Represents an entity type.
// Entity types serve as a tool for extracting parameter values from natural
// language queries.
type EntityType struct {
	// Required for all methods except `create` (`create` populates the name
	// automatically.
	// The unique identifier of the entity type. Format:
	// `projects/<Project ID>/agent/entityTypes/<Entity Type ID>`.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Required. The name of the entity.
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Required. Indicates the kind of entity type.
	Kind EntityType_Kind `protobuf:"varint,3,opt,name=kind,proto3,enum=google.cloud.dialogflow.v2.EntityType_Kind" json:"kind,omitempty"`
	// Optional. Indicates whether the entity type can be automatically
	// expanded.
	AutoExpansionMode EntityType_AutoExpansionMode `protobuf:"varint,4,opt,name=auto_expansion_mode,json=autoExpansionMode,proto3,enum=google.cloud.dialogflow.v2.EntityType_AutoExpansionMode" json:"auto_expansion_mode,omitempty"`
	// Optional. The collection of entities associated with the entity type.
	Entities             []*EntityType_Entity `protobuf:"bytes,6,rep,name=entities,proto3" json:"entities,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_EntityType proto.InternalMessageInfo

func (m *EntityType) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *EntityType) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *EntityType) GetKind() EntityType_Kind {
	if m != nil {
		return m.Kind
	}
	return EntityType_KIND_UNSPECIFIED
}

func (m *EntityType) GetAutoExpansionMode() EntityType_AutoExpansionMode {
	if m != nil {
		return m.AutoExpansionMode
	}
	return EntityType_AUTO_EXPANSION_MODE_UNSPECIFIED
}

func (m *EntityType) GetEntities() []*EntityType_Entity {
	if m != nil {
		return m.Entities
	}
	return nil
}

// Optional. Represents an entity.
type EntityType_Entity struct {
	// Required.
	// For `KIND_MAP` entity types:
	//   A canonical name to be used in place of synonyms.
	// For `KIND_LIST` entity types:
	//   A string that can contain references to other entity types (with or
	//   without aliases).
	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	// Required. A collection of synonyms. For `KIND_LIST` entity types this
	// must contain exactly one synonym equal to `value`.
	Synonyms             []string `protobuf:"bytes,2,rep,name=synonyms,proto3" json:"synonyms,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_EntityType_Entity proto.InternalMessageInfo

func (m *EntityType_Entity) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func (m *EntityType_Entity) GetSynonyms() []string {
	if m != nil {
		return m.Synonyms
	}
	return nil
}

// The request message for [EntityTypes.ListEntityTypes][google.cloud.dialogflow.v2.EntityTypes.ListEntityTypes].
type ListEntityTypesRequest struct {
	// Required. The agent to list all entity types from.
	// Format: `projects/<Project ID>/agent`.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Optional. The language to list entity synonyms for. If not specified,
	// the agent's default language is used.
	// [More than a dozen
	// languages](https://dialogflow.com/docs/reference/language) are supported.
	// Note: languages must be enabled in the agent, before they can be used.
	LanguageCode string `protobuf:"bytes,2,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// Optional. The maximum number of items to return in a single page. By
	// default 100 and at most 1000.
	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Optional. The next_page_token value returned from a previous list request.
	PageToken            string   `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ListEntityTypesRequest proto.InternalMessageInfo

func (m *ListEntityTypesRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *ListEntityTypesRequest) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

func (m *ListEntityTypesRequest) GetPageSize() int32 {
	if m != nil {
		return m.PageSize
	}
	return 0
}

func (m *ListEntityTypesRequest) GetPageToken() string {
	if m != nil {
		return m.PageToken
	}
	return ""
}

// The response message for [EntityTypes.ListEntityTypes][google.cloud.dialogflow.v2.EntityTypes.ListEntityTypes].
type ListEntityTypesResponse struct {
	// The list of agent entity types. There will be a maximum number of items
	// returned based on the page_size field in the request.
	EntityTypes []*EntityType `protobuf:"bytes,1,rep,name=entity_types,json=entityTypes,proto3" json:"entity_types,omitempty"`
	// Token to retrieve the next page of results, or empty if there are no
	// more results in the list.
	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ListEntityTypesResponse proto.InternalMessageInfo

func (m *ListEntityTypesResponse) GetEntityTypes() []*EntityType {
	if m != nil {
		return m.EntityTypes
	}
	return nil
}

func (m *ListEntityTypesResponse) GetNextPageToken() string {
	if m != nil {
		return m.NextPageToken
	}
	return ""
}

// The request message for [EntityTypes.GetEntityType][google.cloud.dialogflow.v2.EntityTypes.GetEntityType].
type GetEntityTypeRequest struct {
	// Required. The name of the entity type.
	// Format: `projects/<Project ID>/agent/entityTypes/<EntityType ID>`.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Optional. The language to retrieve entity synonyms for. If not specified,
	// the agent's default language is used.
	// [More than a dozen
	// languages](https://dialogflow.com/docs/reference/language) are supported.
	// Note: languages must be enabled in the agent, before they can be used.
	LanguageCode         string   `protobuf:"bytes,2,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetEntityTypeRequest) Reset()         { *m = GetEntityTypeRequest{} }
func (m *GetEntityTypeRequest) String() string { return proto.CompactTextString(m) }
func (*GetEntityTypeRequest) ProtoMessage()    {}
func (*GetEntityTypeRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{3}
}

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

var xxx_messageInfo_GetEntityTypeRequest proto.InternalMessageInfo

func (m *GetEntityTypeRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *GetEntityTypeRequest) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

// The request message for [EntityTypes.CreateEntityType][google.cloud.dialogflow.v2.EntityTypes.CreateEntityType].
type CreateEntityTypeRequest struct {
	// Required. The agent to create a entity type for.
	// Format: `projects/<Project ID>/agent`.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. The entity type to create.
	EntityType *EntityType `protobuf:"bytes,2,opt,name=entity_type,json=entityType,proto3" json:"entity_type,omitempty"`
	// Optional. The language of entity synonyms defined in `entity_type`. If not
	// specified, the agent's default language is used.
	// [More than a dozen
	// languages](https://dialogflow.com/docs/reference/language) are supported.
	// Note: languages must be enabled in the agent, before they can be used.
	LanguageCode         string   `protobuf:"bytes,3,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateEntityTypeRequest) Reset()         { *m = CreateEntityTypeRequest{} }
func (m *CreateEntityTypeRequest) String() string { return proto.CompactTextString(m) }
func (*CreateEntityTypeRequest) ProtoMessage()    {}
func (*CreateEntityTypeRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{4}
}

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

var xxx_messageInfo_CreateEntityTypeRequest proto.InternalMessageInfo

func (m *CreateEntityTypeRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *CreateEntityTypeRequest) GetEntityType() *EntityType {
	if m != nil {
		return m.EntityType
	}
	return nil
}

func (m *CreateEntityTypeRequest) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

// The request message for [EntityTypes.UpdateEntityType][google.cloud.dialogflow.v2.EntityTypes.UpdateEntityType].
type UpdateEntityTypeRequest struct {
	// Required. The entity type to update.
	// Format: `projects/<Project ID>/agent/entityTypes/<EntityType ID>`.
	EntityType *EntityType `protobuf:"bytes,1,opt,name=entity_type,json=entityType,proto3" json:"entity_type,omitempty"`
	// Optional. The language of entity synonyms defined in `entity_type`. If not
	// specified, the agent's default language is used.
	// [More than a dozen
	// languages](https://dialogflow.com/docs/reference/language) are supported.
	// Note: languages must be enabled in the agent, before they can be used.
	LanguageCode string `protobuf:"bytes,2,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// Optional. The mask to control which fields get updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,3,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *UpdateEntityTypeRequest) Reset()         { *m = UpdateEntityTypeRequest{} }
func (m *UpdateEntityTypeRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateEntityTypeRequest) ProtoMessage()    {}
func (*UpdateEntityTypeRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{5}
}

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

var xxx_messageInfo_UpdateEntityTypeRequest proto.InternalMessageInfo

func (m *UpdateEntityTypeRequest) GetEntityType() *EntityType {
	if m != nil {
		return m.EntityType
	}
	return nil
}

func (m *UpdateEntityTypeRequest) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

func (m *UpdateEntityTypeRequest) GetUpdateMask() *field_mask.FieldMask {
	if m != nil {
		return m.UpdateMask
	}
	return nil
}

// The request message for [EntityTypes.DeleteEntityType][google.cloud.dialogflow.v2.EntityTypes.DeleteEntityType].
type DeleteEntityTypeRequest struct {
	// Required. The name of the entity type to delete.
	// Format: `projects/<Project ID>/agent/entityTypes/<EntityType ID>`.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeleteEntityTypeRequest) Reset()         { *m = DeleteEntityTypeRequest{} }
func (m *DeleteEntityTypeRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteEntityTypeRequest) ProtoMessage()    {}
func (*DeleteEntityTypeRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{6}
}

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

var xxx_messageInfo_DeleteEntityTypeRequest proto.InternalMessageInfo

func (m *DeleteEntityTypeRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// The request message for [EntityTypes.BatchUpdateEntityTypes][google.cloud.dialogflow.v2.EntityTypes.BatchUpdateEntityTypes].
type BatchUpdateEntityTypesRequest struct {
	// Required. The name of the agent to update or create entity types in.
	// Format: `projects/<Project ID>/agent`.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. The source of the entity type batch.
	//
	// For each entity type in the batch:
	// * If `name` is specified, we update an existing entity type.
	// * If `name` is not specified, we create a new entity type.
	//
	// Types that are valid to be assigned to EntityTypeBatch:
	//	*BatchUpdateEntityTypesRequest_EntityTypeBatchUri
	//	*BatchUpdateEntityTypesRequest_EntityTypeBatchInline
	EntityTypeBatch isBatchUpdateEntityTypesRequest_EntityTypeBatch `protobuf_oneof:"entity_type_batch"`
	// Optional. The language of entity synonyms defined in `entity_types`. If not
	// specified, the agent's default language is used.
	// [More than a dozen
	// languages](https://dialogflow.com/docs/reference/language) are supported.
	// Note: languages must be enabled in the agent, before they can be used.
	LanguageCode string `protobuf:"bytes,4,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// Optional. The mask to control which fields get updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,5,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *BatchUpdateEntityTypesRequest) Reset()         { *m = BatchUpdateEntityTypesRequest{} }
func (m *BatchUpdateEntityTypesRequest) String() string { return proto.CompactTextString(m) }
func (*BatchUpdateEntityTypesRequest) ProtoMessage()    {}
func (*BatchUpdateEntityTypesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{7}
}

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

var xxx_messageInfo_BatchUpdateEntityTypesRequest proto.InternalMessageInfo

func (m *BatchUpdateEntityTypesRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

type isBatchUpdateEntityTypesRequest_EntityTypeBatch interface {
	isBatchUpdateEntityTypesRequest_EntityTypeBatch()
}

type BatchUpdateEntityTypesRequest_EntityTypeBatchUri struct {
	EntityTypeBatchUri string `protobuf:"bytes,2,opt,name=entity_type_batch_uri,json=entityTypeBatchUri,proto3,oneof"`
}

type BatchUpdateEntityTypesRequest_EntityTypeBatchInline struct {
	EntityTypeBatchInline *EntityTypeBatch `protobuf:"bytes,3,opt,name=entity_type_batch_inline,json=entityTypeBatchInline,proto3,oneof"`
}

func (*BatchUpdateEntityTypesRequest_EntityTypeBatchUri) isBatchUpdateEntityTypesRequest_EntityTypeBatch() {
}

func (*BatchUpdateEntityTypesRequest_EntityTypeBatchInline) isBatchUpdateEntityTypesRequest_EntityTypeBatch() {
}

func (m *BatchUpdateEntityTypesRequest) GetEntityTypeBatch() isBatchUpdateEntityTypesRequest_EntityTypeBatch {
	if m != nil {
		return m.EntityTypeBatch
	}
	return nil
}

func (m *BatchUpdateEntityTypesRequest) GetEntityTypeBatchUri() string {
	if x, ok := m.GetEntityTypeBatch().(*BatchUpdateEntityTypesRequest_EntityTypeBatchUri); ok {
		return x.EntityTypeBatchUri
	}
	return ""
}

func (m *BatchUpdateEntityTypesRequest) GetEntityTypeBatchInline() *EntityTypeBatch {
	if x, ok := m.GetEntityTypeBatch().(*BatchUpdateEntityTypesRequest_EntityTypeBatchInline); ok {
		return x.EntityTypeBatchInline
	}
	return nil
}

func (m *BatchUpdateEntityTypesRequest) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

func (m *BatchUpdateEntityTypesRequest) GetUpdateMask() *field_mask.FieldMask {
	if m != nil {
		return m.UpdateMask
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*BatchUpdateEntityTypesRequest) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _BatchUpdateEntityTypesRequest_OneofMarshaler, _BatchUpdateEntityTypesRequest_OneofUnmarshaler, _BatchUpdateEntityTypesRequest_OneofSizer, []interface{}{
		(*BatchUpdateEntityTypesRequest_EntityTypeBatchUri)(nil),
		(*BatchUpdateEntityTypesRequest_EntityTypeBatchInline)(nil),
	}
}

func _BatchUpdateEntityTypesRequest_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*BatchUpdateEntityTypesRequest)
	// entity_type_batch
	switch x := m.EntityTypeBatch.(type) {
	case *BatchUpdateEntityTypesRequest_EntityTypeBatchUri:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.EntityTypeBatchUri)
	case *BatchUpdateEntityTypesRequest_EntityTypeBatchInline:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.EntityTypeBatchInline); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("BatchUpdateEntityTypesRequest.EntityTypeBatch has unexpected type %T", x)
	}
	return nil
}

func _BatchUpdateEntityTypesRequest_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*BatchUpdateEntityTypesRequest)
	switch tag {
	case 2: // entity_type_batch.entity_type_batch_uri
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.EntityTypeBatch = &BatchUpdateEntityTypesRequest_EntityTypeBatchUri{x}
		return true, err
	case 3: // entity_type_batch.entity_type_batch_inline
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(EntityTypeBatch)
		err := b.DecodeMessage(msg)
		m.EntityTypeBatch = &BatchUpdateEntityTypesRequest_EntityTypeBatchInline{msg}
		return true, err
	default:
		return false, nil
	}
}

func _BatchUpdateEntityTypesRequest_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*BatchUpdateEntityTypesRequest)
	// entity_type_batch
	switch x := m.EntityTypeBatch.(type) {
	case *BatchUpdateEntityTypesRequest_EntityTypeBatchUri:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(len(x.EntityTypeBatchUri)))
		n += len(x.EntityTypeBatchUri)
	case *BatchUpdateEntityTypesRequest_EntityTypeBatchInline:
		s := proto.Size(x.EntityTypeBatchInline)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// The response message for [EntityTypes.BatchUpdateEntityTypes][google.cloud.dialogflow.v2.EntityTypes.BatchUpdateEntityTypes].
type BatchUpdateEntityTypesResponse struct {
	// The collection of updated or created entity types.
	EntityTypes          []*EntityType `protobuf:"bytes,1,rep,name=entity_types,json=entityTypes,proto3" json:"entity_types,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *BatchUpdateEntityTypesResponse) Reset()         { *m = BatchUpdateEntityTypesResponse{} }
func (m *BatchUpdateEntityTypesResponse) String() string { return proto.CompactTextString(m) }
func (*BatchUpdateEntityTypesResponse) ProtoMessage()    {}
func (*BatchUpdateEntityTypesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{8}
}

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

var xxx_messageInfo_BatchUpdateEntityTypesResponse proto.InternalMessageInfo

func (m *BatchUpdateEntityTypesResponse) GetEntityTypes() []*EntityType {
	if m != nil {
		return m.EntityTypes
	}
	return nil
}

// The request message for [EntityTypes.BatchDeleteEntityTypes][google.cloud.dialogflow.v2.EntityTypes.BatchDeleteEntityTypes].
type BatchDeleteEntityTypesRequest struct {
	// Required. The name of the agent to delete all entities types for. Format:
	// `projects/<Project ID>/agent`.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. The names entity types to delete. All names must point to the
	// same agent as `parent`.
	EntityTypeNames      []string `protobuf:"bytes,2,rep,name=entity_type_names,json=entityTypeNames,proto3" json:"entity_type_names,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BatchDeleteEntityTypesRequest) Reset()         { *m = BatchDeleteEntityTypesRequest{} }
func (m *BatchDeleteEntityTypesRequest) String() string { return proto.CompactTextString(m) }
func (*BatchDeleteEntityTypesRequest) ProtoMessage()    {}
func (*BatchDeleteEntityTypesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{9}
}

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

var xxx_messageInfo_BatchDeleteEntityTypesRequest proto.InternalMessageInfo

func (m *BatchDeleteEntityTypesRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *BatchDeleteEntityTypesRequest) GetEntityTypeNames() []string {
	if m != nil {
		return m.EntityTypeNames
	}
	return nil
}

// The request message for [EntityTypes.BatchCreateEntities][google.cloud.dialogflow.v2.EntityTypes.BatchCreateEntities].
type BatchCreateEntitiesRequest struct {
	// Required. The name of the entity type to create entities in. Format:
	// `projects/<Project ID>/agent/entityTypes/<Entity Type ID>`.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. The collection of entities to create.
	Entities []*EntityType_Entity `protobuf:"bytes,2,rep,name=entities,proto3" json:"entities,omitempty"`
	// Optional. The language of entity synonyms defined in `entities`. If not
	// specified, the agent's default language is used.
	// [More than a dozen
	// languages](https://dialogflow.com/docs/reference/language) are supported.
	// Note: languages must be enabled in the agent, before they can be used.
	LanguageCode         string   `protobuf:"bytes,3,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BatchCreateEntitiesRequest) Reset()         { *m = BatchCreateEntitiesRequest{} }
func (m *BatchCreateEntitiesRequest) String() string { return proto.CompactTextString(m) }
func (*BatchCreateEntitiesRequest) ProtoMessage()    {}
func (*BatchCreateEntitiesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{10}
}

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

var xxx_messageInfo_BatchCreateEntitiesRequest proto.InternalMessageInfo

func (m *BatchCreateEntitiesRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *BatchCreateEntitiesRequest) GetEntities() []*EntityType_Entity {
	if m != nil {
		return m.Entities
	}
	return nil
}

func (m *BatchCreateEntitiesRequest) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

// The response message for [EntityTypes.BatchCreateEntities][google.cloud.dialogflow.v2.EntityTypes.BatchCreateEntities].
type BatchUpdateEntitiesRequest struct {
	// Required. The name of the entity type to update the entities in. Format:
	// `projects/<Project ID>/agent/entityTypes/<Entity Type ID>`.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. The collection of new entities to replace the existing entities.
	Entities []*EntityType_Entity `protobuf:"bytes,2,rep,name=entities,proto3" json:"entities,omitempty"`
	// Optional. The language of entity synonyms defined in `entities`. If not
	// specified, the agent's default language is used.
	// [More than a dozen
	// languages](https://dialogflow.com/docs/reference/language) are supported.
	// Note: languages must be enabled in the agent, before they can be used.
	LanguageCode string `protobuf:"bytes,3,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// Optional. The mask to control which fields get updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *BatchUpdateEntitiesRequest) Reset()         { *m = BatchUpdateEntitiesRequest{} }
func (m *BatchUpdateEntitiesRequest) String() string { return proto.CompactTextString(m) }
func (*BatchUpdateEntitiesRequest) ProtoMessage()    {}
func (*BatchUpdateEntitiesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{11}
}

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

var xxx_messageInfo_BatchUpdateEntitiesRequest proto.InternalMessageInfo

func (m *BatchUpdateEntitiesRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *BatchUpdateEntitiesRequest) GetEntities() []*EntityType_Entity {
	if m != nil {
		return m.Entities
	}
	return nil
}

func (m *BatchUpdateEntitiesRequest) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

func (m *BatchUpdateEntitiesRequest) GetUpdateMask() *field_mask.FieldMask {
	if m != nil {
		return m.UpdateMask
	}
	return nil
}

// The request message for [EntityTypes.BatchDeleteEntities][google.cloud.dialogflow.v2.EntityTypes.BatchDeleteEntities].
type BatchDeleteEntitiesRequest struct {
	// Required. The name of the entity type to delete entries for. Format:
	// `projects/<Project ID>/agent/entityTypes/<Entity Type ID>`.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. The canonical `values` of the entities to delete. Note that
	// these are not fully-qualified names, i.e. they don't start with
	// `projects/<Project ID>`.
	EntityValues []string `protobuf:"bytes,2,rep,name=entity_values,json=entityValues,proto3" json:"entity_values,omitempty"`
	// Optional. The language of entity synonyms defined in `entities`. If not
	// specified, the agent's default language is used.
	// [More than a dozen
	// languages](https://dialogflow.com/docs/reference/language) are supported.
	// Note: languages must be enabled in the agent, before they can be used.
	LanguageCode         string   `protobuf:"bytes,3,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BatchDeleteEntitiesRequest) Reset()         { *m = BatchDeleteEntitiesRequest{} }
func (m *BatchDeleteEntitiesRequest) String() string { return proto.CompactTextString(m) }
func (*BatchDeleteEntitiesRequest) ProtoMessage()    {}
func (*BatchDeleteEntitiesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{12}
}

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

var xxx_messageInfo_BatchDeleteEntitiesRequest proto.InternalMessageInfo

func (m *BatchDeleteEntitiesRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *BatchDeleteEntitiesRequest) GetEntityValues() []string {
	if m != nil {
		return m.EntityValues
	}
	return nil
}

func (m *BatchDeleteEntitiesRequest) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

// This message is a wrapper around a collection of entity types.
type EntityTypeBatch struct {
	// A collection of entity types.
	EntityTypes          []*EntityType `protobuf:"bytes,1,rep,name=entity_types,json=entityTypes,proto3" json:"entity_types,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *EntityTypeBatch) Reset()         { *m = EntityTypeBatch{} }
func (m *EntityTypeBatch) String() string { return proto.CompactTextString(m) }
func (*EntityTypeBatch) ProtoMessage()    {}
func (*EntityTypeBatch) Descriptor() ([]byte, []int) {
	return fileDescriptor_252de8d6c5f5c76d, []int{13}
}

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

var xxx_messageInfo_EntityTypeBatch proto.InternalMessageInfo

func (m *EntityTypeBatch) GetEntityTypes() []*EntityType {
	if m != nil {
		return m.EntityTypes
	}
	return nil
}

func init() {
	proto.RegisterEnum("google.cloud.dialogflow.v2.EntityType_Kind", EntityType_Kind_name, EntityType_Kind_value)
	proto.RegisterEnum("google.cloud.dialogflow.v2.EntityType_AutoExpansionMode", EntityType_AutoExpansionMode_name, EntityType_AutoExpansionMode_value)
	proto.RegisterType((*EntityType)(nil), "google.cloud.dialogflow.v2.EntityType")
	proto.RegisterType((*EntityType_Entity)(nil), "google.cloud.dialogflow.v2.EntityType.Entity")
	proto.RegisterType((*ListEntityTypesRequest)(nil), "google.cloud.dialogflow.v2.ListEntityTypesRequest")
	proto.RegisterType((*ListEntityTypesResponse)(nil), "google.cloud.dialogflow.v2.ListEntityTypesResponse")
	proto.RegisterType((*GetEntityTypeRequest)(nil), "google.cloud.dialogflow.v2.GetEntityTypeRequest")
	proto.RegisterType((*CreateEntityTypeRequest)(nil), "google.cloud.dialogflow.v2.CreateEntityTypeRequest")
	proto.RegisterType((*UpdateEntityTypeRequest)(nil), "google.cloud.dialogflow.v2.UpdateEntityTypeRequest")
	proto.RegisterType((*DeleteEntityTypeRequest)(nil), "google.cloud.dialogflow.v2.DeleteEntityTypeRequest")
	proto.RegisterType((*BatchUpdateEntityTypesRequest)(nil), "google.cloud.dialogflow.v2.BatchUpdateEntityTypesRequest")
	proto.RegisterType((*BatchUpdateEntityTypesResponse)(nil), "google.cloud.dialogflow.v2.BatchUpdateEntityTypesResponse")
	proto.RegisterType((*BatchDeleteEntityTypesRequest)(nil), "google.cloud.dialogflow.v2.BatchDeleteEntityTypesRequest")
	proto.RegisterType((*BatchCreateEntitiesRequest)(nil), "google.cloud.dialogflow.v2.BatchCreateEntitiesRequest")
	proto.RegisterType((*BatchUpdateEntitiesRequest)(nil), "google.cloud.dialogflow.v2.BatchUpdateEntitiesRequest")
	proto.RegisterType((*BatchDeleteEntitiesRequest)(nil), "google.cloud.dialogflow.v2.BatchDeleteEntitiesRequest")
	proto.RegisterType((*EntityTypeBatch)(nil), "google.cloud.dialogflow.v2.EntityTypeBatch")
}

func init() {
	proto.RegisterFile("google/cloud/dialogflow/v2/entity_type.proto", fileDescriptor_252de8d6c5f5c76d)
}

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

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// EntityTypesClient is the client API for EntityTypes service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type EntityTypesClient interface {
	// Returns the list of all entity types in the specified agent.
	ListEntityTypes(ctx context.Context, in *ListEntityTypesRequest, opts ...grpc.CallOption) (*ListEntityTypesResponse, error)
	// Retrieves the specified entity type.
	GetEntityType(ctx context.Context, in *GetEntityTypeRequest, opts ...grpc.CallOption) (*EntityType, error)
	// Creates an entity type in the specified agent.
	CreateEntityType(ctx context.Context, in *CreateEntityTypeRequest, opts ...grpc.CallOption) (*EntityType, error)
	// Updates the specified entity type.
	UpdateEntityType(ctx context.Context, in *UpdateEntityTypeRequest, opts ...grpc.CallOption) (*EntityType, error)
	// Deletes the specified entity type.
	DeleteEntityType(ctx context.Context, in *DeleteEntityTypeRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Updates/Creates multiple entity types in the specified agent.
	//
	// Operation <response: [BatchUpdateEntityTypesResponse][google.cloud.dialogflow.v2.BatchUpdateEntityTypesResponse],
	//            metadata: [google.protobuf.Struct][google.protobuf.Struct]>
	BatchUpdateEntityTypes(ctx context.Context, in *BatchUpdateEntityTypesRequest, opts ...grpc.CallOption) (*longrunning.Operation, error)
	// Deletes entity types in the specified agent.
	//
	// Operation <response: [google.protobuf.Empty][google.protobuf.Empty],
	//            metadata: [google.protobuf.Struct][google.protobuf.Struct]>
	BatchDeleteEntityTypes(ctx context.Context, in *BatchDeleteEntityTypesRequest, opts ...grpc.CallOption) (*longrunning.Operation, error)
	// Creates multiple new entities in the specified entity type (extends the
	// existing collection of entries).
	//
	// Operation <response: [google.protobuf.Empty][google.protobuf.Empty]>
	BatchCreateEntities(ctx context.Context, in *BatchCreateEntitiesRequest, opts ...grpc.CallOption) (*longrunning.Operation, error)
	// Updates entities in the specified entity type (replaces the existing
	// collection of entries).
	//
	// Operation <response: [google.protobuf.Empty][google.protobuf.Empty],
	//            metadata: [google.protobuf.Struct][google.protobuf.Struct]>
	BatchUpdateEntities(ctx context.Context, in *BatchUpdateEntitiesRequest, opts ...grpc.CallOption) (*longrunning.Operation, error)
	// Deletes entities in the specified entity type.
	//
	// Operation <response: [google.protobuf.Empty][google.protobuf.Empty],
	//            metadata: [google.protobuf.Struct][google.protobuf.Struct]>
	BatchDeleteEntities(ctx context.Context, in *BatchDeleteEntitiesRequest, opts ...grpc.CallOption) (*longrunning.Operation, error)
}

type entityTypesClient struct {
	cc *grpc.ClientConn
}

func NewEntityTypesClient(cc *grpc.ClientConn) EntityTypesClient {
	return &entityTypesClient{cc}
}

func (c *entityTypesClient) ListEntityTypes(ctx context.Context, in *ListEntityTypesRequest, opts ...grpc.CallOption) (*ListEntityTypesResponse, error) {
	out := new(ListEntityTypesResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.dialogflow.v2.EntityTypes/ListEntityTypes", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *entityTypesClient) GetEntityType(ctx context.Context, in *GetEntityTypeRequest, opts ...grpc.CallOption) (*EntityType, error) {
	out := new(EntityType)
	err := c.cc.Invoke(ctx, "/google.cloud.dialogflow.v2.EntityTypes/GetEntityType", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *entityTypesClient) CreateEntityType(ctx context.Context, in *CreateEntityTypeRequest, opts ...grpc.CallOption) (*EntityType, error) {
	out := new(EntityType)
	err := c.cc.Invoke(ctx, "/google.cloud.dialogflow.v2.EntityTypes/CreateEntityType", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *entityTypesClient) UpdateEntityType(ctx context.Context, in *UpdateEntityTypeRequest, opts ...grpc.CallOption) (*EntityType, error) {
	out := new(EntityType)
	err := c.cc.Invoke(ctx, "/google.cloud.dialogflow.v2.EntityTypes/UpdateEntityType", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *entityTypesClient) DeleteEntityType(ctx context.Context, in *DeleteEntityTypeRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.cloud.dialogflow.v2.EntityTypes/DeleteEntityType", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *entityTypesClient) BatchUpdateEntityTypes(ctx context.Context, in *BatchUpdateEntityTypesRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) {
	out := new(longrunning.Operation)
	err := c.cc.Invoke(ctx, "/google.cloud.dialogflow.v2.EntityTypes/BatchUpdateEntityTypes", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *entityTypesClient) BatchDeleteEntityTypes(ctx context.Context, in *BatchDeleteEntityTypesRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) {
	out := new(longrunning.Operation)
	err := c.cc.Invoke(ctx, "/google.cloud.dialogflow.v2.EntityTypes/BatchDeleteEntityTypes", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *entityTypesClient) BatchCreateEntities(ctx context.Context, in *BatchCreateEntitiesRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) {
	out := new(longrunning.Operation)
	err := c.cc.Invoke(ctx, "/google.cloud.dialogflow.v2.EntityTypes/BatchCreateEntities", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *entityTypesClient) BatchUpdateEntities(ctx context.Context, in *BatchUpdateEntitiesRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) {
	out := new(longrunning.Operation)
	err := c.cc.Invoke(ctx, "/google.cloud.dialogflow.v2.EntityTypes/BatchUpdateEntities", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *entityTypesClient) BatchDeleteEntities(ctx context.Context, in *BatchDeleteEntitiesRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) {
	out := new(longrunning.Operation)
	err := c.cc.Invoke(ctx, "/google.cloud.dialogflow.v2.EntityTypes/BatchDeleteEntities", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// EntityTypesServer is the server API for EntityTypes service.
type EntityTypesServer interface {
	// Returns the list of all entity types in the specified agent.
	ListEntityTypes(context.Context, *ListEntityTypesRequest) (*ListEntityTypesResponse, error)
	// Retrieves the specified entity type.
	GetEntityType(context.Context, *GetEntityTypeRequest) (*EntityType, error)
	// Creates an entity type in the specified agent.
	CreateEntityType(context.Context, *CreateEntityTypeRequest) (*EntityType, error)
	// Updates the specified entity type.
	UpdateEntityType(context.Context, *UpdateEntityTypeRequest) (*EntityType, error)
	// Deletes the specified entity type.
	DeleteEntityType(context.Context, *DeleteEntityTypeRequest) (*empty.Empty, error)
	// Updates/Creates multiple entity types in the specified agent.
	//
	// Operation <response: [BatchUpdateEntityTypesResponse][google.cloud.dialogflow.v2.BatchUpdateEntityTypesResponse],
	//            metadata: [google.protobuf.Struct][google.protobuf.Struct]>
	BatchUpdateEntityTypes(context.Context, *BatchUpdateEntityTypesRequest) (*longrunning.Operation, error)
	// Deletes entity types in the specified agent.
	//
	// Operation <response: [google.protobuf.Empty][google.protobuf.Empty],
	//            metadata: [google.protobuf.Struct][google.protobuf.Struct]>
	BatchDeleteEntityTypes(context.Context, *BatchDeleteEntityTypesRequest) (*longrunning.Operation, error)
	// Creates multiple new entities in the specified entity type (extends the
	// existing collection of entries).
	//
	// Operation <response: [google.protobuf.Empty][google.protobuf.Empty]>
	BatchCreateEntities(context.Context, *BatchCreateEntitiesRequest) (*longrunning.Operation, error)
	// Updates entities in the specified entity type (replaces the existing
	// collection of entries).
	//
	// Operation <response: [google.protobuf.Empty][google.protobuf.Empty],
	//            metadata: [google.protobuf.Struct][google.protobuf.Struct]>
	BatchUpdateEntities(context.Context, *BatchUpdateEntitiesRequest) (*longrunning.Operation, error)
	// Deletes entities in the specified entity type.
	//
	// Operation <response: [google.protobuf.Empty][google.protobuf.Empty],
	//            metadata: [google.protobuf.Struct][google.protobuf.Struct]>
	BatchDeleteEntities(context.Context, *BatchDeleteEntitiesRequest) (*longrunning.Operation, error)
}

func RegisterEntityTypesServer(s *grpc.Server, srv EntityTypesServer) {
	s.RegisterService(&_EntityTypes_serviceDesc, srv)
}

func _EntityTypes_ListEntityTypes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListEntityTypesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(EntityTypesServer).ListEntityTypes(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.dialogflow.v2.EntityTypes/ListEntityTypes",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(EntityTypesServer).ListEntityTypes(ctx, req.(*ListEntityTypesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _EntityTypes_GetEntityType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetEntityTypeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(EntityTypesServer).GetEntityType(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.dialogflow.v2.EntityTypes/GetEntityType",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(EntityTypesServer).GetEntityType(ctx, req.(*GetEntityTypeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _EntityTypes_CreateEntityType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateEntityTypeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(EntityTypesServer).CreateEntityType(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.dialogflow.v2.EntityTypes/CreateEntityType",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(EntityTypesServer).CreateEntityType(ctx, req.(*CreateEntityTypeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _EntityTypes_UpdateEntityType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateEntityTypeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(EntityTypesServer).UpdateEntityType(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.dialogflow.v2.EntityTypes/UpdateEntityType",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(EntityTypesServer).UpdateEntityType(ctx, req.(*UpdateEntityTypeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _EntityTypes_DeleteEntityType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteEntityTypeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(EntityTypesServer).DeleteEntityType(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.dialogflow.v2.EntityTypes/DeleteEntityType",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(EntityTypesServer).DeleteEntityType(ctx, req.(*DeleteEntityTypeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _EntityTypes_BatchUpdateEntityTypes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BatchUpdateEntityTypesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(EntityTypesServer).BatchUpdateEntityTypes(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.dialogflow.v2.EntityTypes/BatchUpdateEntityTypes",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(EntityTypesServer).BatchUpdateEntityTypes(ctx, req.(*BatchUpdateEntityTypesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _EntityTypes_BatchDeleteEntityTypes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BatchDeleteEntityTypesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(EntityTypesServer).BatchDeleteEntityTypes(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.dialogflow.v2.EntityTypes/BatchDeleteEntityTypes",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(EntityTypesServer).BatchDeleteEntityTypes(ctx, req.(*BatchDeleteEntityTypesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _EntityTypes_BatchCreateEntities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BatchCreateEntitiesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(EntityTypesServer).BatchCreateEntities(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.dialogflow.v2.EntityTypes/BatchCreateEntities",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(EntityTypesServer).BatchCreateEntities(ctx, req.(*BatchCreateEntitiesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _EntityTypes_BatchUpdateEntities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BatchUpdateEntitiesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(EntityTypesServer).BatchUpdateEntities(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.dialogflow.v2.EntityTypes/BatchUpdateEntities",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(EntityTypesServer).BatchUpdateEntities(ctx, req.(*BatchUpdateEntitiesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _EntityTypes_BatchDeleteEntities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BatchDeleteEntitiesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(EntityTypesServer).BatchDeleteEntities(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.dialogflow.v2.EntityTypes/BatchDeleteEntities",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(EntityTypesServer).BatchDeleteEntities(ctx, req.(*BatchDeleteEntitiesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _EntityTypes_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.cloud.dialogflow.v2.EntityTypes",
	HandlerType: (*EntityTypesServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "ListEntityTypes",
			Handler:    _EntityTypes_ListEntityTypes_Handler,
		},
		{
			MethodName: "GetEntityType",
			Handler:    _EntityTypes_GetEntityType_Handler,
		},
		{
			MethodName: "CreateEntityType",
			Handler:    _EntityTypes_CreateEntityType_Handler,
		},
		{
			MethodName: "UpdateEntityType",
			Handler:    _EntityTypes_UpdateEntityType_Handler,
		},
		{
			MethodName: "DeleteEntityType",
			Handler:    _EntityTypes_DeleteEntityType_Handler,
		},
		{
			MethodName: "BatchUpdateEntityTypes",
			Handler:    _EntityTypes_BatchUpdateEntityTypes_Handler,
		},
		{
			MethodName: "BatchDeleteEntityTypes",
			Handler:    _EntityTypes_BatchDeleteEntityTypes_Handler,
		},
		{
			MethodName: "BatchCreateEntities",
			Handler:    _EntityTypes_BatchCreateEntities_Handler,
		},
		{
			MethodName: "BatchUpdateEntities",
			Handler:    _EntityTypes_BatchUpdateEntities_Handler,
		},
		{
			MethodName: "BatchDeleteEntities",
			Handler:    _EntityTypes_BatchDeleteEntities_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/cloud/dialogflow/v2/entity_type.proto",
}
