// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/not_whitelisted_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 not whitelisted errors.
type NotWhitelistedErrorEnum_NotWhitelistedError int32

const (
	// Enum unspecified.
	NotWhitelistedErrorEnum_UNSPECIFIED NotWhitelistedErrorEnum_NotWhitelistedError = 0
	// The received error code is not known in this version.
	NotWhitelistedErrorEnum_UNKNOWN NotWhitelistedErrorEnum_NotWhitelistedError = 1
	// Customer is not whitelisted for accessing this feature.
	NotWhitelistedErrorEnum_CUSTOMER_NOT_WHITELISTED_FOR_THIS_FEATURE NotWhitelistedErrorEnum_NotWhitelistedError = 2
)

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

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

func (x NotWhitelistedErrorEnum_NotWhitelistedError) String() string {
	return proto.EnumName(NotWhitelistedErrorEnum_NotWhitelistedError_name, int32(x))
}

func (NotWhitelistedErrorEnum_NotWhitelistedError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_ff351e315ddc124d, []int{0, 0}
}

// Container for enum describing possible not whitelisted errors.
type NotWhitelistedErrorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_NotWhitelistedErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.NotWhitelistedErrorEnum_NotWhitelistedError", NotWhitelistedErrorEnum_NotWhitelistedError_name, NotWhitelistedErrorEnum_NotWhitelistedError_value)
	proto.RegisterType((*NotWhitelistedErrorEnum)(nil), "google.ads.googleads.v3.errors.NotWhitelistedErrorEnum")
}

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

var fileDescriptor_ff351e315ddc124d = []byte{
	// 328 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xb1, 0x4e, 0xc3, 0x30,
	0x14, 0x45, 0x69, 0x90, 0x40, 0x72, 0x07, 0xaa, 0x30, 0x80, 0x10, 0xea, 0x90, 0x8d, 0x01, 0x67,
	0xc8, 0x66, 0xa6, 0xb4, 0x75, 0xdb, 0x08, 0x48, 0xaa, 0x26, 0x69, 0x25, 0x14, 0xc9, 0x4a, 0x71,
	0x64, 0x22, 0xb5, 0x7e, 0x55, 0x6c, 0xca, 0xc4, 0xcf, 0x30, 0xf2, 0x29, 0x7c, 0x0a, 0x2b, 0x3f,
	0x80, 0x12, 0xd3, 0xb2, 0x14, 0xa6, 0x5c, 0xbd, 0xdc, 0x73, 0x7d, 0xdf, 0x43, 0x44, 0x00, 0x88,
	0x65, 0xe1, 0xe6, 0x5c, 0xb9, 0x46, 0xd6, 0x6a, 0xe3, 0xb9, 0x45, 0x55, 0x41, 0xa5, 0x5c, 0x09,
	0x9a, 0xbd, 0x3c, 0x95, 0xba, 0x58, 0x96, 0x4a, 0x17, 0x9c, 0x35, 0x63, 0xbc, 0xae, 0x40, 0x83,
	0xdd, 0x35, 0x00, 0xce, 0xb9, 0xc2, 0x3b, 0x16, 0x6f, 0x3c, 0x6c, 0xd8, 0x8b, 0xcb, 0x6d, 0xf6,
	0xba, 0x74, 0x73, 0x29, 0x41, 0xe7, 0xba, 0x04, 0xa9, 0x0c, 0xed, 0xbc, 0xa2, 0xb3, 0x10, 0xf4,
	0xfc, 0x37, 0x9b, 0xd6, 0x14, 0x95, 0xcf, 0x2b, 0x67, 0x81, 0x4e, 0xf7, 0xfc, 0xb2, 0x4f, 0x50,
	0x3b, 0x0d, 0xe3, 0x09, 0xed, 0x07, 0xc3, 0x80, 0x0e, 0x3a, 0x07, 0x76, 0x1b, 0x1d, 0xa7, 0xe1,
	0x6d, 0x18, 0xcd, 0xc3, 0x4e, 0xcb, 0xbe, 0x46, 0x57, 0xfd, 0x34, 0x4e, 0xa2, 0x7b, 0x3a, 0x65,
	0x61, 0x94, 0xb0, 0xf9, 0x38, 0x48, 0xe8, 0x5d, 0x10, 0x27, 0x74, 0xc0, 0x86, 0xd1, 0x94, 0x25,
	0xe3, 0x20, 0x66, 0x43, 0xea, 0x27, 0xe9, 0x94, 0x76, 0xac, 0xde, 0x57, 0x0b, 0x39, 0x8f, 0xb0,
	0xc2, 0xff, 0xef, 0xd0, 0x3b, 0xdf, 0x53, 0x64, 0x52, 0xf7, 0x9f, 0xb4, 0x1e, 0x06, 0x3f, 0xac,
	0x80, 0x65, 0x2e, 0x05, 0x86, 0x4a, 0xb8, 0xa2, 0x90, 0xcd, 0x76, 0xdb, 0x5b, 0xae, 0x4b, 0xf5,
	0xd7, 0x69, 0x6f, 0xcc, 0xe7, 0xcd, 0x3a, 0x1c, 0xf9, 0xfe, 0xbb, 0xd5, 0x1d, 0x99, 0x30, 0x9f,
	0x2b, 0x6c, 0x64, 0xad, 0x66, 0x1e, 0x6e, 0x9e, 0x54, 0x1f, 0x5b, 0x43, 0xe6, 0x73, 0x95, 0xed,
	0x0c, 0xd9, 0xcc, 0xcb, 0x8c, 0xe1, 0xd3, 0x72, 0xcc, 0x94, 0x10, 0x9f, 0x2b, 0x42, 0x76, 0x16,
	0x42, 0x66, 0x1e, 0x21, 0xc6, 0xb4, 0x38, 0x6a, 0xda, 0x79, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff,
	0x73, 0xc3, 0x90, 0x71, 0xf7, 0x01, 0x00, 0x00,
}
