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

package enums

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

// The possible policy review statuses.
type PolicyReviewStatusEnum_PolicyReviewStatus int32

const (
	// No value has been specified.
	PolicyReviewStatusEnum_UNSPECIFIED PolicyReviewStatusEnum_PolicyReviewStatus = 0
	// The received value is not known in this version.
	//
	// This is a response-only value.
	PolicyReviewStatusEnum_UNKNOWN PolicyReviewStatusEnum_PolicyReviewStatus = 1
	// Currently under review.
	PolicyReviewStatusEnum_REVIEW_IN_PROGRESS PolicyReviewStatusEnum_PolicyReviewStatus = 2
	// Primary review complete. Other reviews may be continuing.
	PolicyReviewStatusEnum_REVIEWED PolicyReviewStatusEnum_PolicyReviewStatus = 3
	// The resource has been resubmitted for approval or its policy decision has
	// been appealed.
	PolicyReviewStatusEnum_UNDER_APPEAL PolicyReviewStatusEnum_PolicyReviewStatus = 4
	// The resource is eligible and may be serving but could still undergo
	// further review.
	PolicyReviewStatusEnum_ELIGIBLE_MAY_SERVE PolicyReviewStatusEnum_PolicyReviewStatus = 5
)

var PolicyReviewStatusEnum_PolicyReviewStatus_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "REVIEW_IN_PROGRESS",
	3: "REVIEWED",
	4: "UNDER_APPEAL",
	5: "ELIGIBLE_MAY_SERVE",
}

var PolicyReviewStatusEnum_PolicyReviewStatus_value = map[string]int32{
	"UNSPECIFIED":        0,
	"UNKNOWN":            1,
	"REVIEW_IN_PROGRESS": 2,
	"REVIEWED":           3,
	"UNDER_APPEAL":       4,
	"ELIGIBLE_MAY_SERVE": 5,
}

func (x PolicyReviewStatusEnum_PolicyReviewStatus) String() string {
	return proto.EnumName(PolicyReviewStatusEnum_PolicyReviewStatus_name, int32(x))
}

func (PolicyReviewStatusEnum_PolicyReviewStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c693618f5306b1b3, []int{0, 0}
}

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

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

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

var xxx_messageInfo_PolicyReviewStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.PolicyReviewStatusEnum_PolicyReviewStatus", PolicyReviewStatusEnum_PolicyReviewStatus_name, PolicyReviewStatusEnum_PolicyReviewStatus_value)
	proto.RegisterType((*PolicyReviewStatusEnum)(nil), "google.ads.googleads.v3.enums.PolicyReviewStatusEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/enums/policy_review_status.proto", fileDescriptor_c693618f5306b1b3)
}

var fileDescriptor_c693618f5306b1b3 = []byte{
	// 351 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4b, 0xfb, 0x30,
	0x1c, 0xfe, 0xb7, 0xfb, 0xbf, 0x91, 0x0d, 0x2c, 0x39, 0x4c, 0x10, 0x77, 0xd8, 0x3e, 0x40, 0x7a,
	0xe8, 0x45, 0xe2, 0x29, 0x75, 0xb1, 0x14, 0x67, 0x17, 0x5a, 0xd6, 0xa1, 0x14, 0x42, 0x5d, 0x4b,
	0x29, 0x6c, 0x49, 0x59, 0xba, 0x89, 0x57, 0xbf, 0x87, 0x17, 0x8f, 0x7e, 0x14, 0x3f, 0x8a, 0xf8,
	0x21, 0xa4, 0xe9, 0xb6, 0xcb, 0xd0, 0x4b, 0x78, 0xc8, 0xf3, 0xc2, 0xef, 0x79, 0xc0, 0x45, 0x21,
	0x65, 0xb1, 0xcc, 0xed, 0x34, 0x53, 0x76, 0x0b, 0x1b, 0xb4, 0x75, 0xec, 0x5c, 0x6c, 0x56, 0xca,
	0xae, 0xe4, 0xb2, 0x5c, 0x3c, 0xf1, 0x75, 0xbe, 0x2d, 0xf3, 0x47, 0xae, 0xea, 0xb4, 0xde, 0x28,
	0x54, 0xad, 0x65, 0x2d, 0xe1, 0xa0, 0x95, 0xa3, 0x34, 0x53, 0xe8, 0xe0, 0x44, 0x5b, 0x07, 0x69,
	0xe7, 0xd9, 0xf9, 0x3e, 0xb8, 0x2a, 0xed, 0x54, 0x08, 0x59, 0xa7, 0x75, 0x29, 0xc5, 0xce, 0x3c,
	0x7a, 0x31, 0x40, 0x9f, 0xe9, 0xec, 0x50, 0x47, 0x47, 0x3a, 0x99, 0x8a, 0xcd, 0x6a, 0xf4, 0x6c,
	0x00, 0x78, 0x4c, 0xc1, 0x13, 0xd0, 0x9d, 0x05, 0x11, 0xa3, 0x57, 0xfe, 0xb5, 0x4f, 0xc7, 0xd6,
	0x2f, 0xd8, 0x05, 0xff, 0x66, 0xc1, 0x4d, 0x30, 0x9d, 0x07, 0x96, 0x01, 0xfb, 0x00, 0x86, 0x34,
	0xf6, 0xe9, 0x9c, 0xfb, 0x01, 0x67, 0xe1, 0xd4, 0x0b, 0x69, 0x14, 0x59, 0x26, 0xec, 0x81, 0xff,
	0xed, 0x3f, 0x1d, 0x5b, 0x1d, 0x68, 0x81, 0xde, 0x2c, 0x18, 0xd3, 0x90, 0x13, 0xc6, 0x28, 0x99,
	0x58, 0xbf, 0x1b, 0x1f, 0x9d, 0xf8, 0x9e, 0xef, 0x4e, 0x28, 0xbf, 0x25, 0x77, 0x3c, 0xa2, 0x61,
	0x4c, 0xad, 0x3f, 0xee, 0xa7, 0x01, 0x86, 0x0b, 0xb9, 0x42, 0x3f, 0x76, 0x74, 0x4f, 0x8f, 0xef,
	0x64, 0x4d, 0x3d, 0x66, 0xdc, 0xbb, 0x3b, 0x67, 0x21, 0x97, 0xa9, 0x28, 0x90, 0x5c, 0x17, 0x76,
	0x91, 0x0b, 0x5d, 0x7e, 0xbf, 0x73, 0x55, 0xaa, 0x6f, 0x66, 0xbf, 0xd4, 0xef, 0xab, 0xd9, 0xf1,
	0x08, 0x79, 0x33, 0x07, 0x5e, 0x1b, 0x45, 0x32, 0x85, 0x5a, 0xd8, 0xa0, 0xd8, 0x41, 0xcd, 0x5c,
	0xea, 0x7d, 0xcf, 0x27, 0x24, 0x53, 0xc9, 0x81, 0x4f, 0x62, 0x27, 0xd1, 0xfc, 0x87, 0x39, 0x6c,
	0x3f, 0x31, 0x26, 0x99, 0xc2, 0xf8, 0xa0, 0xc0, 0x38, 0x76, 0x30, 0xd6, 0x9a, 0x87, 0xbf, 0xfa,
	0x30, 0xe7, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x84, 0x21, 0x68, 0x0e, 0x02, 0x00, 0x00,
}
