// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/policy_approval_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 approval statuses. When there are several approval
// statuses available the most severe one will be used. The order of severity
// is DISAPPROVED, AREA_OF_INTEREST_ONLY, APPROVED_LIMITED and APPROVED.
type PolicyApprovalStatusEnum_PolicyApprovalStatus int32

const (
	// No value has been specified.
	PolicyApprovalStatusEnum_UNSPECIFIED PolicyApprovalStatusEnum_PolicyApprovalStatus = 0
	// The received value is not known in this version.
	//
	// This is a response-only value.
	PolicyApprovalStatusEnum_UNKNOWN PolicyApprovalStatusEnum_PolicyApprovalStatus = 1
	// Will not serve.
	PolicyApprovalStatusEnum_DISAPPROVED PolicyApprovalStatusEnum_PolicyApprovalStatus = 2
	// Serves with restrictions.
	PolicyApprovalStatusEnum_APPROVED_LIMITED PolicyApprovalStatusEnum_PolicyApprovalStatus = 3
	// Serves without restrictions.
	PolicyApprovalStatusEnum_APPROVED PolicyApprovalStatusEnum_PolicyApprovalStatus = 4
	// Will not serve in targeted countries, but may serve for users who are
	// searching for information about the targeted countries.
	PolicyApprovalStatusEnum_AREA_OF_INTEREST_ONLY PolicyApprovalStatusEnum_PolicyApprovalStatus = 5
)

var PolicyApprovalStatusEnum_PolicyApprovalStatus_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "DISAPPROVED",
	3: "APPROVED_LIMITED",
	4: "APPROVED",
	5: "AREA_OF_INTEREST_ONLY",
}

var PolicyApprovalStatusEnum_PolicyApprovalStatus_value = map[string]int32{
	"UNSPECIFIED":           0,
	"UNKNOWN":               1,
	"DISAPPROVED":           2,
	"APPROVED_LIMITED":      3,
	"APPROVED":              4,
	"AREA_OF_INTEREST_ONLY": 5,
}

func (x PolicyApprovalStatusEnum_PolicyApprovalStatus) String() string {
	return proto.EnumName(PolicyApprovalStatusEnum_PolicyApprovalStatus_name, int32(x))
}

func (PolicyApprovalStatusEnum_PolicyApprovalStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_f111d9ed5ef13a4d, []int{0, 0}
}

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

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

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

var xxx_messageInfo_PolicyApprovalStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.PolicyApprovalStatusEnum_PolicyApprovalStatus", PolicyApprovalStatusEnum_PolicyApprovalStatus_name, PolicyApprovalStatusEnum_PolicyApprovalStatus_value)
	proto.RegisterType((*PolicyApprovalStatusEnum)(nil), "google.ads.googleads.v3.enums.PolicyApprovalStatusEnum")
}

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

var fileDescriptor_f111d9ed5ef13a4d = []byte{
	// 347 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcb, 0x4a, 0xf3, 0x40,
	0x14, 0xfe, 0x93, 0xfe, 0x5e, 0x98, 0x0a, 0x86, 0x50, 0xc1, 0x8a, 0x5d, 0xb4, 0x0f, 0x30, 0x59,
	0x64, 0x37, 0xae, 0xa6, 0x66, 0x5a, 0x82, 0x35, 0x09, 0x4d, 0x1b, 0x51, 0x02, 0x61, 0x6c, 0x4a,
	0x08, 0xa4, 0x33, 0xa1, 0x93, 0x16, 0xdc, 0xfb, 0x22, 0xba, 0xf4, 0x51, 0x7c, 0x14, 0x17, 0x3e,
	0x83, 0x64, 0x72, 0x59, 0x55, 0x37, 0xc3, 0x37, 0xe7, 0xbb, 0x70, 0xce, 0x07, 0x50, 0xc2, 0x79,
	0x92, 0xad, 0x0d, 0x1a, 0x0b, 0xa3, 0x82, 0x25, 0xda, 0x9b, 0xc6, 0x9a, 0xed, 0x36, 0xc2, 0xc8,
	0x79, 0x96, 0xae, 0x5e, 0x22, 0x9a, 0xe7, 0x5b, 0xbe, 0xa7, 0x59, 0x24, 0x0a, 0x5a, 0xec, 0x04,
	0xcc, 0xb7, 0xbc, 0xe0, 0xfa, 0xa0, 0x32, 0x40, 0x1a, 0x0b, 0xd8, 0x7a, 0xe1, 0xde, 0x84, 0xd2,
	0x7b, 0x75, 0xdd, 0x44, 0xe7, 0xa9, 0x41, 0x19, 0xe3, 0x05, 0x2d, 0x52, 0xce, 0x6a, 0xf3, 0xe8,
	0x4d, 0x01, 0x97, 0x9e, 0x4c, 0xc7, 0x75, 0xb8, 0x2f, 0xb3, 0x09, 0xdb, 0x6d, 0x46, 0xaf, 0x0a,
	0xe8, 0x1d, 0x22, 0xf5, 0x73, 0xd0, 0x5d, 0x3a, 0xbe, 0x47, 0x6e, 0xed, 0x89, 0x4d, 0x2c, 0xed,
	0x9f, 0xde, 0x05, 0x27, 0x4b, 0xe7, 0xce, 0x71, 0x1f, 0x1c, 0x4d, 0x29, 0x59, 0xcb, 0xf6, 0xb1,
	0xe7, 0xcd, 0xdd, 0x80, 0x58, 0x9a, 0xaa, 0xf7, 0x80, 0xd6, 0xfc, 0xa2, 0x99, 0x7d, 0x6f, 0x2f,
	0x88, 0xa5, 0x75, 0xf4, 0x33, 0x70, 0xda, 0x6a, 0xfe, 0xeb, 0x7d, 0x70, 0x81, 0xe7, 0x04, 0x47,
	0xee, 0x24, 0xb2, 0x9d, 0x05, 0x99, 0x13, 0x7f, 0x11, 0xb9, 0xce, 0xec, 0x51, 0x3b, 0x1a, 0x7f,
	0x2b, 0x60, 0xb8, 0xe2, 0x1b, 0xf8, 0xe7, 0x9d, 0xe3, 0xfe, 0xa1, 0x4d, 0xbd, 0xf2, 0x48, 0x4f,
	0x79, 0x1a, 0xd7, 0xde, 0x84, 0x67, 0x94, 0x25, 0x90, 0x6f, 0x13, 0x23, 0x59, 0x33, 0x59, 0x41,
	0xd3, 0x77, 0x9e, 0x8a, 0x5f, 0xea, 0xbf, 0x91, 0xef, 0xbb, 0xda, 0x99, 0x62, 0xfc, 0xa1, 0x0e,
	0xa6, 0x55, 0x14, 0x8e, 0x05, 0xac, 0x60, 0x89, 0x02, 0x13, 0x96, 0x95, 0x89, 0xcf, 0x86, 0x0f,
	0x71, 0x2c, 0xc2, 0x96, 0x0f, 0x03, 0x33, 0x94, 0xfc, 0x97, 0x3a, 0xac, 0x86, 0x08, 0xe1, 0x58,
	0x20, 0xd4, 0x2a, 0x10, 0x0a, 0x4c, 0x84, 0xa4, 0xe6, 0xf9, 0x58, 0x2e, 0x66, 0xfe, 0x04, 0x00,
	0x00, 0xff, 0xff, 0x2f, 0x49, 0x5c, 0x3e, 0x16, 0x02, 0x00, 0x00,
}
