// 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/v3/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
	// Client has too many managers.
	CustomerClientLinkErrorEnum_CLIENT_HAS_TOO_MANY_MANAGERS CustomerClientLinkErrorEnum_CustomerClientLinkError = 9
)

// 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",
		9: "CLIENT_HAS_TOO_MANY_MANAGERS",
	}
	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,
		"CLIENT_HAS_TOO_MANY_MANAGERS":              9,
	}
)

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_v3_errors_customer_client_link_error_proto_enumTypes[0].Descriptor()
}

func (CustomerClientLinkErrorEnum_CustomerClientLinkError) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_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_v3_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_v3_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_v3_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_v3_errors_customer_client_link_error_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v3_errors_customer_client_link_error_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_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, 0x33, 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, 0x33, 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,
	0x8f, 0x03, 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,
	0xef, 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, 0x12,
	0x20, 0x0a, 0x1c, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x48, 0x41, 0x53, 0x5f, 0x54, 0x4f,
	0x4f, 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x52, 0x53, 0x10,
	0x09, 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,
	0x33, 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, 0x33,
	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, 0x33, 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, 0x33, 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, 0x33, 0x3a, 0x3a, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v3_errors_customer_client_link_error_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_errors_customer_client_link_error_proto_rawDescData = file_google_ads_googleads_v3_errors_customer_client_link_error_proto_rawDesc
)

func file_google_ads_googleads_v3_errors_customer_client_link_error_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_errors_customer_client_link_error_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_errors_customer_client_link_error_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_errors_customer_client_link_error_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_errors_customer_client_link_error_proto_rawDescData
}

var file_google_ads_googleads_v3_errors_customer_client_link_error_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_errors_customer_client_link_error_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_errors_customer_client_link_error_proto_goTypes = []interface{}{
	(CustomerClientLinkErrorEnum_CustomerClientLinkError)(0), // 0: google.ads.googleads.v3.errors.CustomerClientLinkErrorEnum.CustomerClientLinkError
	(*CustomerClientLinkErrorEnum)(nil),                      // 1: google.ads.googleads.v3.errors.CustomerClientLinkErrorEnum
}
var file_google_ads_googleads_v3_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_v3_errors_customer_client_link_error_proto_init() }
func file_google_ads_googleads_v3_errors_customer_client_link_error_proto_init() {
	if File_google_ads_googleads_v3_errors_customer_client_link_error_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_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_v3_errors_customer_client_link_error_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_errors_customer_client_link_error_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_errors_customer_client_link_error_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_errors_customer_client_link_error_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_errors_customer_client_link_error_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_errors_customer_client_link_error_proto = out.File
	file_google_ads_googleads_v3_errors_customer_client_link_error_proto_rawDesc = nil
	file_google_ads_googleads_v3_errors_customer_client_link_error_proto_goTypes = nil
	file_google_ads_googleads_v3_errors_customer_client_link_error_proto_depIdxs = nil
}
