// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/ads/googleads/v2/errors/customer_client_link_error.proto

package errors

import (
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// Enum describing possible CustomerClientLink errors.
type CustomerClientLinkErrorEnum_CustomerClientLinkError int32

const (
	// Enum unspecified.
	CustomerClientLinkErrorEnum_UNSPECIFIED CustomerClientLinkErrorEnum_CustomerClientLinkError = 0
	// The received error code is not known in this version.
	CustomerClientLinkErrorEnum_UNKNOWN CustomerClientLinkErrorEnum_CustomerClientLinkError = 1
	// Trying to manage a client that already in being managed by customer.
	CustomerClientLinkErrorEnum_CLIENT_ALREADY_INVITED_BY_THIS_MANAGER CustomerClientLinkErrorEnum_CustomerClientLinkError = 2
	// Already managed by some other manager in the hierarchy.
	CustomerClientLinkErrorEnum_CLIENT_ALREADY_MANAGED_IN_HIERARCHY CustomerClientLinkErrorEnum_CustomerClientLinkError = 3
	// Attempt to create a cycle in the hierarchy.
	CustomerClientLinkErrorEnum_CYCLIC_LINK_NOT_ALLOWED CustomerClientLinkErrorEnum_CustomerClientLinkError = 4
	// Managed accounts has the maximum number of linked accounts.
	CustomerClientLinkErrorEnum_CUSTOMER_HAS_TOO_MANY_ACCOUNTS CustomerClientLinkErrorEnum_CustomerClientLinkError = 5
	// Invitor has the maximum pending invitations.
	CustomerClientLinkErrorEnum_CLIENT_HAS_TOO_MANY_INVITATIONS CustomerClientLinkErrorEnum_CustomerClientLinkError = 6
	// Attempt to change hidden status of a link that is not active.
	CustomerClientLinkErrorEnum_CANNOT_HIDE_OR_UNHIDE_MANAGER_ACCOUNTS CustomerClientLinkErrorEnum_CustomerClientLinkError = 7
	// Parent manager account has the maximum number of linked accounts.
	CustomerClientLinkErrorEnum_CUSTOMER_HAS_TOO_MANY_ACCOUNTS_AT_MANAGER CustomerClientLinkErrorEnum_CustomerClientLinkError = 8
)

// Enum value maps for CustomerClientLinkErrorEnum_CustomerClientLinkError.
var (
	CustomerClientLinkErrorEnum_CustomerClientLinkError_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "CLIENT_ALREADY_INVITED_BY_THIS_MANAGER",
		3: "CLIENT_ALREADY_MANAGED_IN_HIERARCHY",
		4: "CYCLIC_LINK_NOT_ALLOWED",
		5: "CUSTOMER_HAS_TOO_MANY_ACCOUNTS",
		6: "CLIENT_HAS_TOO_MANY_INVITATIONS",
		7: "CANNOT_HIDE_OR_UNHIDE_MANAGER_ACCOUNTS",
		8: "CUSTOMER_HAS_TOO_MANY_ACCOUNTS_AT_MANAGER",
	}
	CustomerClientLinkErrorEnum_CustomerClientLinkError_value = map[string]int32{
		"UNSPECIFIED":                               0,
		"UNKNOWN":                                   1,
		"CLIENT_ALREADY_INVITED_BY_THIS_MANAGER":    2,
		"CLIENT_ALREADY_MANAGED_IN_HIERARCHY":       3,
		"CYCLIC_LINK_NOT_ALLOWED":                   4,
		"CUSTOMER_HAS_TOO_MANY_ACCOUNTS":            5,
		"CLIENT_HAS_TOO_MANY_INVITATIONS":           6,
		"CANNOT_HIDE_OR_UNHIDE_MANAGER_ACCOUNTS":    7,
		"CUSTOMER_HAS_TOO_MANY_ACCOUNTS_AT_MANAGER": 8,
	}
)

func (x CustomerClientLinkErrorEnum_CustomerClientLinkError) Enum() *CustomerClientLinkErrorEnum_CustomerClientLinkError {
	p := new(CustomerClientLinkErrorEnum_CustomerClientLinkError)
	*p = x
	return p
}

func (x CustomerClientLinkErrorEnum_CustomerClientLinkError) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (CustomerClientLinkErrorEnum_CustomerClientLinkError) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_errors_customer_client_link_error_proto_enumTypes[0].Descriptor()
}

func (CustomerClientLinkErrorEnum_CustomerClientLinkError) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_errors_customer_client_link_error_proto_enumTypes[0]
}

func (x CustomerClientLinkErrorEnum_CustomerClientLinkError) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use CustomerClientLinkErrorEnum_CustomerClientLinkError.Descriptor instead.
func (CustomerClientLinkErrorEnum_CustomerClientLinkError) EnumDescriptor() ([]byte, []int) {
	return file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDescGZIP(), []int{0, 0}
}

// Container for enum describing possible CustomeClientLink errors.
type CustomerClientLinkErrorEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *CustomerClientLinkErrorEnum) Reset() {
	*x = CustomerClientLinkErrorEnum{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_googleads_v2_errors_customer_client_link_error_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *CustomerClientLinkErrorEnum) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CustomerClientLinkErrorEnum) ProtoMessage() {}

func (x *CustomerClientLinkErrorEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v2_errors_customer_client_link_error_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CustomerClientLinkErrorEnum.ProtoReflect.Descriptor instead.
func (*CustomerClientLinkErrorEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v2_errors_customer_client_link_error_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDesc = []byte{
	0x0a, 0x3f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73,
	0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74,
	0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x12, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2e, 0x76, 0x32, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72,
	0x73, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e,
	0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
	0xed, 0x02, 0x0a, 0x1b, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65,
	0x6e, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x6e, 0x75, 0x6d, 0x22,
	0xcd, 0x02, 0x0a, 0x17, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65,
	0x6e, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x0f, 0x0a, 0x0b, 0x55,
	0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07,
	0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x2a, 0x0a, 0x26, 0x43, 0x4c, 0x49,
	0x45, 0x4e, 0x54, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x49, 0x4e, 0x56, 0x49,
	0x54, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x48, 0x49, 0x53, 0x5f, 0x4d, 0x41, 0x4e, 0x41,
	0x47, 0x45, 0x52, 0x10, 0x02, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f,
	0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f,
	0x49, 0x4e, 0x5f, 0x48, 0x49, 0x45, 0x52, 0x41, 0x52, 0x43, 0x48, 0x59, 0x10, 0x03, 0x12, 0x1b,
	0x0a, 0x17, 0x43, 0x59, 0x43, 0x4c, 0x49, 0x43, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x4e, 0x4f,
	0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, 0x04, 0x12, 0x22, 0x0a, 0x1e, 0x43,
	0x55, 0x53, 0x54, 0x4f, 0x4d, 0x45, 0x52, 0x5f, 0x48, 0x41, 0x53, 0x5f, 0x54, 0x4f, 0x4f, 0x5f,
	0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x53, 0x10, 0x05, 0x12,
	0x23, 0x0a, 0x1f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x48, 0x41, 0x53, 0x5f, 0x54, 0x4f,
	0x4f, 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x49, 0x4e, 0x56, 0x49, 0x54, 0x41, 0x54, 0x49, 0x4f,
	0x4e, 0x53, 0x10, 0x06, 0x12, 0x2a, 0x0a, 0x26, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x48,
	0x49, 0x44, 0x45, 0x5f, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x48, 0x49, 0x44, 0x45, 0x5f, 0x4d, 0x41,
	0x4e, 0x41, 0x47, 0x45, 0x52, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x53, 0x10, 0x07,
	0x12, 0x2d, 0x0a, 0x29, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x45, 0x52, 0x5f, 0x48, 0x41, 0x53,
	0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e,
	0x54, 0x53, 0x5f, 0x41, 0x54, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x52, 0x10, 0x08, 0x42,
	0xf7, 0x01, 0x0a, 0x22, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61,
	0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2e, 0x76, 0x32, 0x2e,
	0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x42, 0x1c, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72,
	0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x50,
	0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x44, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67,
	0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x64,
	0x73, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x32, 0x2f, 0x65,
	0x72, 0x72, 0x6f, 0x72, 0x73, 0x3b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0xa2, 0x02, 0x03, 0x47,
	0x41, 0x41, 0xaa, 0x02, 0x1e, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x41, 0x64, 0x73, 0x2e,
	0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x2e, 0x56, 0x32, 0x2e, 0x45, 0x72, 0x72,
	0x6f, 0x72, 0x73, 0xca, 0x02, 0x1e, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x41, 0x64, 0x73,
	0x5c, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x5c, 0x56, 0x32, 0x5c, 0x45, 0x72,
	0x72, 0x6f, 0x72, 0x73, 0xea, 0x02, 0x22, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x41,
	0x64, 0x73, 0x3a, 0x3a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x56,
	0x32, 0x3a, 0x3a, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDescData = file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDesc
)

func file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDescData
}

var file_google_ads_googleads_v2_errors_customer_client_link_error_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_errors_customer_client_link_error_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_errors_customer_client_link_error_proto_goTypes = []interface{}{
	(CustomerClientLinkErrorEnum_CustomerClientLinkError)(0), // 0: google.ads.googleads.v2.errors.CustomerClientLinkErrorEnum.CustomerClientLinkError
	(*CustomerClientLinkErrorEnum)(nil),                      // 1: google.ads.googleads.v2.errors.CustomerClientLinkErrorEnum
}
var file_google_ads_googleads_v2_errors_customer_client_link_error_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_google_ads_googleads_v2_errors_customer_client_link_error_proto_init() }
func file_google_ads_googleads_v2_errors_customer_client_link_error_proto_init() {
	if File_google_ads_googleads_v2_errors_customer_client_link_error_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_errors_customer_client_link_error_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CustomerClientLinkErrorEnum); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_errors_customer_client_link_error_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_errors_customer_client_link_error_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_errors_customer_client_link_error_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_errors_customer_client_link_error_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_errors_customer_client_link_error_proto = out.File
	file_google_ads_googleads_v2_errors_customer_client_link_error_proto_rawDesc = nil
	file_google_ads_googleads_v2_errors_customer_client_link_error_proto_goTypes = nil
	file_google_ads_googleads_v2_errors_customer_client_link_error_proto_depIdxs = nil
}
