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

package enums // import "google.golang.org/genproto/googleapis/ads/googleads/v1/enums"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import _ "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.ProtoPackageIsVersion2 // please upgrade the proto package

// The possible quality evaluation approval statuses of a feed item.
type FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus int32

const (
	// No value has been specified.
	FeedItemQualityApprovalStatusEnum_UNSPECIFIED FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus = 0
	// Used for return value only. Represents value unknown in this version.
	FeedItemQualityApprovalStatusEnum_UNKNOWN FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus = 1
	// Meets all quality expectations.
	FeedItemQualityApprovalStatusEnum_APPROVED FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus = 2
	// Does not meet some quality expectations. The specific reason is found in
	// the quality_disapproval_reasons field.
	FeedItemQualityApprovalStatusEnum_DISAPPROVED FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus = 3
)

var FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "APPROVED",
	3: "DISAPPROVED",
}
var FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"APPROVED":    2,
	"DISAPPROVED": 3,
}

func (x FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus) String() string {
	return proto.EnumName(FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus_name, int32(x))
}
func (FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_feed_item_quality_approval_status_6688e7939e1b1ed7, []int{0, 0}
}

// Container for enum describing possible quality evaluation approval statuses
// of a feed item.
type FeedItemQualityApprovalStatusEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FeedItemQualityApprovalStatusEnum) Reset()         { *m = FeedItemQualityApprovalStatusEnum{} }
func (m *FeedItemQualityApprovalStatusEnum) String() string { return proto.CompactTextString(m) }
func (*FeedItemQualityApprovalStatusEnum) ProtoMessage()    {}
func (*FeedItemQualityApprovalStatusEnum) Descriptor() ([]byte, []int) {
	return fileDescriptor_feed_item_quality_approval_status_6688e7939e1b1ed7, []int{0}
}
func (m *FeedItemQualityApprovalStatusEnum) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FeedItemQualityApprovalStatusEnum.Unmarshal(m, b)
}
func (m *FeedItemQualityApprovalStatusEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FeedItemQualityApprovalStatusEnum.Marshal(b, m, deterministic)
}
func (dst *FeedItemQualityApprovalStatusEnum) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FeedItemQualityApprovalStatusEnum.Merge(dst, src)
}
func (m *FeedItemQualityApprovalStatusEnum) XXX_Size() int {
	return xxx_messageInfo_FeedItemQualityApprovalStatusEnum.Size(m)
}
func (m *FeedItemQualityApprovalStatusEnum) XXX_DiscardUnknown() {
	xxx_messageInfo_FeedItemQualityApprovalStatusEnum.DiscardUnknown(m)
}

var xxx_messageInfo_FeedItemQualityApprovalStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterType((*FeedItemQualityApprovalStatusEnum)(nil), "google.ads.googleads.v1.enums.FeedItemQualityApprovalStatusEnum")
	proto.RegisterEnum("google.ads.googleads.v1.enums.FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus", FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus_name, FeedItemQualityApprovalStatusEnum_FeedItemQualityApprovalStatus_value)
}

func init() {
	proto.RegisterFile("google/ads/googleads/v1/enums/feed_item_quality_approval_status.proto", fileDescriptor_feed_item_quality_approval_status_6688e7939e1b1ed7)
}

var fileDescriptor_feed_item_quality_approval_status_6688e7939e1b1ed7 = []byte{
	// 324 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xd1, 0x4a, 0xf3, 0x30,
	0x18, 0xfd, 0xdb, 0xc1, 0xaf, 0x64, 0x82, 0xa3, 0x97, 0xe2, 0x2e, 0xb6, 0x07, 0x48, 0x28, 0xde,
	0xc5, 0xab, 0xcc, 0x75, 0xa3, 0x08, 0x5d, 0x75, 0xac, 0x82, 0x14, 0x4a, 0x34, 0x31, 0x14, 0xda,
	0xa4, 0x2e, 0xe9, 0xc0, 0x4b, 0x5f, 0xc5, 0x4b, 0x1f, 0xc5, 0x47, 0xf1, 0x05, 0xbc, 0x95, 0x26,
	0x5b, 0xef, 0xdc, 0x4d, 0x38, 0xe4, 0x3b, 0xdf, 0x39, 0xdf, 0x39, 0x20, 0x12, 0x4a, 0x89, 0x8a,
	0x23, 0xca, 0x34, 0x72, 0xb0, 0x43, 0xbb, 0x10, 0x71, 0xd9, 0xd6, 0x1a, 0xbd, 0x70, 0xce, 0x8a,
	0xd2, 0xf0, 0xba, 0x78, 0x6d, 0x69, 0x55, 0x9a, 0xb7, 0x82, 0x36, 0xcd, 0x56, 0xed, 0x68, 0x55,
	0x68, 0x43, 0x4d, 0xab, 0x61, 0xb3, 0x55, 0x46, 0x05, 0x63, 0xb7, 0x0b, 0x29, 0xd3, 0xb0, 0x97,
	0x81, 0xbb, 0x10, 0x5a, 0x99, 0x8b, 0xcb, 0x83, 0x4b, 0x53, 0x22, 0x2a, 0xa5, 0x32, 0xd4, 0x94,
	0x4a, 0xee, 0x97, 0xa7, 0xef, 0x1e, 0x98, 0x2c, 0x38, 0x67, 0xb1, 0xe1, 0xf5, 0x9d, 0xb3, 0x21,
	0x7b, 0x97, 0xb5, 0x35, 0x89, 0x64, 0x5b, 0x4f, 0x73, 0x30, 0x3e, 0x4a, 0x0a, 0xce, 0xc1, 0x70,
	0x93, 0xac, 0xd3, 0xe8, 0x26, 0x5e, 0xc4, 0xd1, 0x7c, 0xf4, 0x2f, 0x18, 0x82, 0x93, 0x4d, 0x72,
	0x9b, 0xac, 0x1e, 0x92, 0x91, 0x17, 0x9c, 0x81, 0x53, 0x92, 0xa6, 0xf7, 0xab, 0x2c, 0x9a, 0x8f,
	0xfc, 0x8e, 0x3b, 0x8f, 0xd7, 0xfd, 0xc7, 0x60, 0xf6, 0xe3, 0x81, 0xc9, 0xb3, 0xaa, 0xe1, 0xd1,
	0x1c, 0xb3, 0xe9, 0xd1, 0x0b, 0xd2, 0x2e, 0x4d, 0xea, 0x3d, 0xce, 0xf6, 0x22, 0x42, 0x55, 0x54,
	0x0a, 0xa8, 0xb6, 0x02, 0x09, 0x2e, 0x6d, 0xd6, 0x43, 0xc7, 0x4d, 0xa9, 0xff, 0xa8, 0xfc, 0xda,
	0xbe, 0x1f, 0xfe, 0x60, 0x49, 0xc8, 0xa7, 0x3f, 0x5e, 0x3a, 0x29, 0xc2, 0x34, 0x74, 0xb0, 0x43,
	0x59, 0x08, 0xbb, 0x4a, 0xf4, 0xd7, 0x61, 0x9e, 0x13, 0xa6, 0xf3, 0x7e, 0x9e, 0x67, 0x61, 0x6e,
	0xe7, 0xdf, 0xfe, 0xc4, 0x7d, 0x62, 0x4c, 0x98, 0xc6, 0xb8, 0x67, 0x60, 0x9c, 0x85, 0x18, 0x5b,
	0xce, 0xd3, 0x7f, 0x7b, 0xd8, 0xd5, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3a, 0x83, 0xd4, 0xbb,
	0x0a, 0x02, 0x00, 0x00,
}
