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

package errors

import (
	fmt "fmt"
	math "math"

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

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Enum describing possible errors in payments account service.
type PaymentsAccountErrorEnum_PaymentsAccountError int32

const (
	// Enum unspecified.
	PaymentsAccountErrorEnum_UNSPECIFIED PaymentsAccountErrorEnum_PaymentsAccountError = 0
	// The received error code is not known in this version.
	PaymentsAccountErrorEnum_UNKNOWN PaymentsAccountErrorEnum_PaymentsAccountError = 1
	// Manager customers are not supported for payments account service.
	PaymentsAccountErrorEnum_NOT_SUPPORTED_FOR_MANAGER_CUSTOMER PaymentsAccountErrorEnum_PaymentsAccountError = 2
)

var PaymentsAccountErrorEnum_PaymentsAccountError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "NOT_SUPPORTED_FOR_MANAGER_CUSTOMER",
}

var PaymentsAccountErrorEnum_PaymentsAccountError_value = map[string]int32{
	"UNSPECIFIED":                        0,
	"UNKNOWN":                            1,
	"NOT_SUPPORTED_FOR_MANAGER_CUSTOMER": 2,
}

func (x PaymentsAccountErrorEnum_PaymentsAccountError) String() string {
	return proto.EnumName(PaymentsAccountErrorEnum_PaymentsAccountError_name, int32(x))
}

func (PaymentsAccountErrorEnum_PaymentsAccountError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_4aeb35bbf3b6a431, []int{0, 0}
}

// Container for enum describing possible errors in payments account service.
type PaymentsAccountErrorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PaymentsAccountErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.PaymentsAccountErrorEnum_PaymentsAccountError", PaymentsAccountErrorEnum_PaymentsAccountError_name, PaymentsAccountErrorEnum_PaymentsAccountError_value)
	proto.RegisterType((*PaymentsAccountErrorEnum)(nil), "google.ads.googleads.v3.errors.PaymentsAccountErrorEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/errors/payments_account_error.proto", fileDescriptor_4aeb35bbf3b6a431)
}

var fileDescriptor_4aeb35bbf3b6a431 = []byte{
	// 322 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xb1, 0x6a, 0xeb, 0x30,
	0x18, 0x85, 0x6f, 0x7c, 0xa1, 0x05, 0x65, 0x68, 0x30, 0x1d, 0xda, 0x52, 0x32, 0x78, 0xe8, 0x28,
	0x0f, 0xda, 0x94, 0x49, 0x49, 0x94, 0x10, 0x4a, 0x64, 0xe1, 0xc4, 0x29, 0x14, 0x83, 0x50, 0x63,
	0x23, 0x02, 0x89, 0x64, 0x2c, 0x27, 0xb4, 0xaf, 0xd3, 0xb1, 0x8f, 0xd2, 0x47, 0xe9, 0xdc, 0x07,
	0x28, 0xb6, 0x12, 0x4f, 0x69, 0x27, 0x1d, 0x7e, 0x9d, 0xef, 0xe8, 0xe8, 0x07, 0x03, 0x65, 0x8c,
	0xda, 0xe6, 0xa1, 0xcc, 0x6c, 0xe8, 0x64, 0xad, 0x0e, 0x28, 0xcc, 0xcb, 0xd2, 0x94, 0x36, 0x2c,
	0xe4, 0xdb, 0x2e, 0xd7, 0x95, 0x15, 0x72, 0xbd, 0x36, 0x7b, 0x5d, 0x89, 0x66, 0x0e, 0x8b, 0xd2,
	0x54, 0xc6, 0xef, 0x3b, 0x02, 0xca, 0xcc, 0xc2, 0x16, 0x86, 0x07, 0x04, 0x1d, 0x7c, 0x77, 0x7f,
	0x0a, 0x2f, 0x36, 0xa1, 0xd4, 0xda, 0x54, 0xb2, 0xda, 0x18, 0x6d, 0x1d, 0x1d, 0xbc, 0x82, 0x1b,
	0x7e, 0x4c, 0x27, 0x2e, 0x9c, 0xd6, 0x18, 0xd5, 0xfb, 0x5d, 0x90, 0x82, 0xeb, 0x73, 0x77, 0xfe,
	0x15, 0xe8, 0x26, 0x6c, 0xc1, 0xe9, 0x68, 0x36, 0x99, 0xd1, 0x71, 0xef, 0x9f, 0xdf, 0x05, 0x97,
	0x09, 0x7b, 0x64, 0xd1, 0x13, 0xeb, 0x75, 0xfc, 0x07, 0x10, 0xb0, 0x68, 0x29, 0x16, 0x09, 0xe7,
	0x51, 0xbc, 0xa4, 0x63, 0x31, 0x89, 0x62, 0x31, 0x27, 0x8c, 0x4c, 0x69, 0x2c, 0x46, 0xc9, 0x62,
	0x19, 0xcd, 0x69, 0xdc, 0xf3, 0x86, 0xdf, 0x1d, 0x10, 0xac, 0xcd, 0x0e, 0xfe, 0x5d, 0x7f, 0x78,
	0x7b, 0xae, 0x02, 0xaf, 0xbb, 0xf3, 0xce, 0xf3, 0xf8, 0x08, 0x2b, 0xb3, 0x95, 0x5a, 0x41, 0x53,
	0xaa, 0x50, 0xe5, 0xba, 0xf9, 0xd9, 0x69, 0x91, 0xc5, 0xc6, 0xfe, 0xb6, 0xd7, 0x81, 0x3b, 0xde,
	0xbd, 0xff, 0x53, 0x42, 0x3e, 0xbc, 0xfe, 0xd4, 0x85, 0x91, 0xcc, 0x42, 0x27, 0x6b, 0xb5, 0x42,
	0xb0, 0x79, 0xd2, 0x7e, 0x9e, 0x0c, 0x29, 0xc9, 0x6c, 0xda, 0x1a, 0xd2, 0x15, 0x4a, 0x9d, 0xe1,
	0xcb, 0x0b, 0xdc, 0x14, 0x63, 0x92, 0x59, 0x8c, 0x5b, 0x0b, 0xc6, 0x2b, 0x84, 0xb1, 0x33, 0xbd,
	0x5c, 0x34, 0xed, 0xd0, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb0, 0x74, 0x12, 0x6c, 0xf4, 0x01,
	0x00, 0x00,
}
