// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/policy_validation_parameter_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 policy validation parameter errors.
type PolicyValidationParameterErrorEnum_PolicyValidationParameterError int32

const (
	// Enum unspecified.
	PolicyValidationParameterErrorEnum_UNSPECIFIED PolicyValidationParameterErrorEnum_PolicyValidationParameterError = 0
	// The received error code is not known in this version.
	PolicyValidationParameterErrorEnum_UNKNOWN PolicyValidationParameterErrorEnum_PolicyValidationParameterError = 1
	// Ignorable policy topics are not supported for the ad type.
	PolicyValidationParameterErrorEnum_UNSUPPORTED_AD_TYPE_FOR_IGNORABLE_POLICY_TOPICS PolicyValidationParameterErrorEnum_PolicyValidationParameterError = 2
	// Exempt policy violation keys are not supported for the ad type.
	PolicyValidationParameterErrorEnum_UNSUPPORTED_AD_TYPE_FOR_EXEMPT_POLICY_VIOLATION_KEYS PolicyValidationParameterErrorEnum_PolicyValidationParameterError = 3
	// Cannot set ignorable policy topics and exempt policy violation keys in
	// the same policy violation parameter.
	PolicyValidationParameterErrorEnum_CANNOT_SET_BOTH_IGNORABLE_POLICY_TOPICS_AND_EXEMPT_POLICY_VIOLATION_KEYS PolicyValidationParameterErrorEnum_PolicyValidationParameterError = 4
)

var PolicyValidationParameterErrorEnum_PolicyValidationParameterError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "UNSUPPORTED_AD_TYPE_FOR_IGNORABLE_POLICY_TOPICS",
	3: "UNSUPPORTED_AD_TYPE_FOR_EXEMPT_POLICY_VIOLATION_KEYS",
	4: "CANNOT_SET_BOTH_IGNORABLE_POLICY_TOPICS_AND_EXEMPT_POLICY_VIOLATION_KEYS",
}

var PolicyValidationParameterErrorEnum_PolicyValidationParameterError_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"UNSUPPORTED_AD_TYPE_FOR_IGNORABLE_POLICY_TOPICS":                          2,
	"UNSUPPORTED_AD_TYPE_FOR_EXEMPT_POLICY_VIOLATION_KEYS":                     3,
	"CANNOT_SET_BOTH_IGNORABLE_POLICY_TOPICS_AND_EXEMPT_POLICY_VIOLATION_KEYS": 4,
}

func (x PolicyValidationParameterErrorEnum_PolicyValidationParameterError) String() string {
	return proto.EnumName(PolicyValidationParameterErrorEnum_PolicyValidationParameterError_name, int32(x))
}

func (PolicyValidationParameterErrorEnum_PolicyValidationParameterError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_55f02adfac78c457, []int{0, 0}
}

// Container for enum describing possible policy validation parameter errors.
type PolicyValidationParameterErrorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PolicyValidationParameterErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.PolicyValidationParameterErrorEnum_PolicyValidationParameterError", PolicyValidationParameterErrorEnum_PolicyValidationParameterError_name, PolicyValidationParameterErrorEnum_PolicyValidationParameterError_value)
	proto.RegisterType((*PolicyValidationParameterErrorEnum)(nil), "google.ads.googleads.v3.errors.PolicyValidationParameterErrorEnum")
}

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

var fileDescriptor_55f02adfac78c457 = []byte{
	// 390 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xb1, 0xaa, 0xdb, 0x30,
	0x18, 0x85, 0x1b, 0xdf, 0xd2, 0x82, 0xee, 0xd0, 0xe0, 0xb1, 0x94, 0x0c, 0xee, 0x2e, 0x0f, 0xee,
	0x50, 0xd4, 0x49, 0x89, 0x95, 0x5c, 0x73, 0x53, 0x49, 0xc4, 0x8a, 0xdb, 0x14, 0x83, 0x50, 0xaf,
	0x8d, 0x31, 0x38, 0x96, 0xb1, 0xdc, 0x40, 0x5f, 0x27, 0x63, 0x1f, 0xa5, 0x8f, 0xd2, 0x57, 0x28,
	0x94, 0x62, 0xeb, 0xda, 0x5b, 0x3c, 0xe9, 0x20, 0xce, 0xf9, 0x8e, 0xf8, 0xf5, 0x83, 0x6d, 0xa1,
	0x75, 0x51, 0xe5, 0xbe, 0xca, 0x8c, 0x6f, 0x65, 0xaf, 0x2e, 0x81, 0x9f, 0xb7, 0xad, 0x6e, 0x8d,
	0xdf, 0xe8, 0xaa, 0x7c, 0xfa, 0x29, 0x2f, 0xaa, 0x2a, 0x33, 0xd5, 0x95, 0xba, 0x96, 0x8d, 0x6a,
	0xd5, 0x39, 0xef, 0xf2, 0x56, 0x0e, 0x16, 0xd8, 0xb4, 0xba, 0xd3, 0xee, 0xca, 0x86, 0xa1, 0xca,
	0x0c, 0x9c, 0x38, 0xf0, 0x12, 0x40, 0xcb, 0x79, 0xfb, 0x6e, 0xec, 0x69, 0x4a, 0x5f, 0xd5, 0xb5,
	0xee, 0x06, 0x98, 0xb1, 0x69, 0xef, 0xea, 0x00, 0x8f, 0x0f, 0x4d, 0xc9, 0x54, 0xc4, 0xc7, 0x1e,
	0xd2, 0x13, 0x48, 0xfd, 0xe3, 0xec, 0xfd, 0x5d, 0x80, 0xd5, 0xbc, 0xcd, 0x7d, 0x03, 0xee, 0x8f,
	0x34, 0xe6, 0x64, 0x13, 0x6d, 0x23, 0x12, 0x2e, 0x5f, 0xb8, 0xf7, 0xe0, 0xf5, 0x91, 0x3e, 0x52,
	0xf6, 0x85, 0x2e, 0x17, 0x6e, 0x00, 0xfc, 0x23, 0x8d, 0x8f, 0x9c, 0xb3, 0x83, 0x20, 0xa1, 0xc4,
	0xa1, 0x14, 0x27, 0x4e, 0xe4, 0x96, 0x1d, 0x64, 0xb4, 0xa3, 0xec, 0x80, 0xd7, 0x7b, 0x22, 0x39,
	0xdb, 0x47, 0x9b, 0x93, 0x14, 0x8c, 0x47, 0x9b, 0x78, 0xe9, 0xb8, 0x1f, 0xc1, 0x87, 0x5b, 0x21,
	0xf2, 0x95, 0x7c, 0xe6, 0x62, 0x4c, 0x24, 0x11, 0xdb, 0x63, 0x11, 0x31, 0x2a, 0x1f, 0xc9, 0x29,
	0x5e, 0xde, 0xb9, 0x7b, 0xf0, 0xb0, 0xc1, 0x94, 0x32, 0x21, 0x63, 0x22, 0xe4, 0x9a, 0x89, 0x87,
	0x5b, 0x35, 0x12, 0xd3, 0x70, 0x9e, 0xf6, 0x72, 0xfd, 0x6f, 0x01, 0xbc, 0x27, 0x7d, 0x86, 0xf3,
	0x93, 0x5e, 0xbf, 0x9f, 0x9f, 0x10, 0xef, 0x07, 0xce, 0x17, 0xdf, 0xc2, 0x67, 0x4c, 0xa1, 0x2b,
	0x55, 0x17, 0x50, 0xb7, 0x85, 0x5f, 0xe4, 0xf5, 0xf0, 0x1d, 0xe3, 0x22, 0x34, 0xa5, 0xb9, 0xb5,
	0x17, 0x9f, 0xec, 0x71, 0x75, 0xee, 0x76, 0x18, 0xff, 0x72, 0x56, 0x3b, 0x0b, 0xc3, 0x99, 0x81,
	0x56, 0xf6, 0x2a, 0x09, 0xe0, 0x50, 0x69, 0x7e, 0x8f, 0x86, 0x14, 0x67, 0x26, 0x9d, 0x0c, 0x69,
	0x12, 0xa4, 0xd6, 0xf0, 0xc7, 0xf1, 0xec, 0x2d, 0x42, 0x38, 0x33, 0x08, 0x4d, 0x16, 0x84, 0x92,
	0x00, 0x21, 0x6b, 0xfa, 0xfe, 0x6a, 0x78, 0x5d, 0xf0, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xaf, 0xfc,
	0xe9, 0xc6, 0xb4, 0x02, 0x00, 0x00,
}
