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

const (
	// Enum unspecified.
	PolicyViolationErrorEnum_UNSPECIFIED PolicyViolationErrorEnum_PolicyViolationError = 0
	// The received error code is not known in this version.
	PolicyViolationErrorEnum_UNKNOWN PolicyViolationErrorEnum_PolicyViolationError = 1
	// A policy was violated. See PolicyViolationDetails for more detail.
	PolicyViolationErrorEnum_POLICY_ERROR PolicyViolationErrorEnum_PolicyViolationError = 2
)

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

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

func (x PolicyViolationErrorEnum_PolicyViolationError) String() string {
	return proto.EnumName(PolicyViolationErrorEnum_PolicyViolationError_name, int32(x))
}

func (PolicyViolationErrorEnum_PolicyViolationError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_a359cb15eb993566, []int{0, 0}
}

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

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

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

var xxx_messageInfo_PolicyViolationErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.PolicyViolationErrorEnum_PolicyViolationError", PolicyViolationErrorEnum_PolicyViolationError_name, PolicyViolationErrorEnum_PolicyViolationError_value)
	proto.RegisterType((*PolicyViolationErrorEnum)(nil), "google.ads.googleads.v3.errors.PolicyViolationErrorEnum")
}

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

var fileDescriptor_a359cb15eb993566 = []byte{
	// 301 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0x84, 0x40,
	0x18, 0xc7, 0x5b, 0x83, 0x82, 0xd9, 0x20, 0x91, 0x0e, 0x15, 0xb1, 0x07, 0x1f, 0x60, 0xe6, 0x30,
	0xb7, 0xd9, 0x93, 0xbb, 0xeb, 0x2e, 0x52, 0xa8, 0x18, 0x6b, 0x14, 0x82, 0xb8, 0xab, 0x0c, 0x82,
	0x3b, 0x9f, 0x38, 0x26, 0xf4, 0x3a, 0x1d, 0x7b, 0x94, 0x1e, 0xa5, 0x73, 0x0f, 0x10, 0xce, 0xa4,
	0xa7, 0xad, 0x93, 0x7f, 0x3e, 0xff, 0xbf, 0xff, 0xf7, 0x9f, 0x0f, 0xcd, 0x39, 0x00, 0xaf, 0x0a,
	0x92, 0xe5, 0x92, 0x68, 0xd9, 0xab, 0x8e, 0x92, 0xa2, 0x69, 0xa0, 0x91, 0xa4, 0x86, 0xaa, 0xdc,
	0xbf, 0xa5, 0x5d, 0x09, 0x55, 0xd6, 0x96, 0x20, 0x52, 0x35, 0xc7, 0x75, 0x03, 0x2d, 0x58, 0x33,
	0x4d, 0xe0, 0x2c, 0x97, 0x78, 0x84, 0x71, 0x47, 0xb1, 0x86, 0x6f, 0xef, 0x86, 0xf0, 0xba, 0x24,
	0x99, 0x10, 0xd0, 0xaa, 0x08, 0xa9, 0x69, 0x7b, 0x87, 0xae, 0x43, 0x95, 0x1e, 0x0f, 0xe1, 0x6e,
	0x8f, 0xb9, 0xe2, 0xf5, 0x60, 0xaf, 0xd1, 0xd5, 0xb1, 0x7f, 0xd6, 0x25, 0x9a, 0x6e, 0xfd, 0xc7,
	0xd0, 0x5d, 0x7a, 0x6b, 0xcf, 0x5d, 0x99, 0x27, 0xd6, 0x14, 0x9d, 0x6f, 0xfd, 0x7b, 0x3f, 0x78,
	0xf2, 0xcd, 0x89, 0x65, 0xa2, 0x8b, 0x30, 0x78, 0xf0, 0x96, 0xcf, 0xa9, 0x1b, 0x45, 0x41, 0x64,
	0x1a, 0x8b, 0xef, 0x09, 0xb2, 0xf7, 0x70, 0xc0, 0xff, 0x17, 0x5d, 0xdc, 0x1c, 0x5b, 0x16, 0xf6,
	0x2d, 0xc3, 0xc9, 0xcb, 0xea, 0x17, 0xe6, 0x50, 0x65, 0x82, 0x63, 0x68, 0x38, 0xe1, 0x85, 0x50,
	0x6f, 0x18, 0x4e, 0x56, 0x97, 0xf2, 0xaf, 0x0b, 0xce, 0xf5, 0xe7, 0xdd, 0x38, 0xdd, 0x38, 0xce,
	0x87, 0x31, 0xdb, 0xe8, 0x30, 0x27, 0x97, 0x58, 0xcb, 0x5e, 0xc5, 0x14, 0xab, 0x95, 0xf2, 0x73,
	0x30, 0x24, 0x4e, 0x2e, 0x93, 0xd1, 0x90, 0xc4, 0x34, 0xd1, 0x86, 0x2f, 0xc3, 0xd6, 0x53, 0xc6,
	0x9c, 0x5c, 0x32, 0x36, 0x5a, 0x18, 0x8b, 0x29, 0x63, 0xda, 0xb4, 0x3b, 0x53, 0xed, 0xe8, 0x4f,
	0x00, 0x00, 0x00, 0xff, 0xff, 0xed, 0x8e, 0x0c, 0xa1, 0xde, 0x01, 0x00, 0x00,
}
