// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/feed_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

// Possible statuses of a feed.
type FeedStatusEnum_FeedStatus int32

const (
	// Not specified.
	FeedStatusEnum_UNSPECIFIED FeedStatusEnum_FeedStatus = 0
	// Used for return value only. Represents value unknown in this version.
	FeedStatusEnum_UNKNOWN FeedStatusEnum_FeedStatus = 1
	// Feed is enabled.
	FeedStatusEnum_ENABLED FeedStatusEnum_FeedStatus = 2
	// Feed has been removed.
	FeedStatusEnum_REMOVED FeedStatusEnum_FeedStatus = 3
)

var FeedStatusEnum_FeedStatus_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "ENABLED",
	3: "REMOVED",
}

var FeedStatusEnum_FeedStatus_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"ENABLED":     2,
	"REMOVED":     3,
}

func (x FeedStatusEnum_FeedStatus) String() string {
	return proto.EnumName(FeedStatusEnum_FeedStatus_name, int32(x))
}

func (FeedStatusEnum_FeedStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_3f6c6129d0eaf758, []int{0, 0}
}

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

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

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

var xxx_messageInfo_FeedStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedStatusEnum_FeedStatus", FeedStatusEnum_FeedStatus_name, FeedStatusEnum_FeedStatus_value)
	proto.RegisterType((*FeedStatusEnum)(nil), "google.ads.googleads.v3.enums.FeedStatusEnum")
}

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

var fileDescriptor_3f6c6129d0eaf758 = []byte{
	// 291 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
	0x18, 0x77, 0x1d, 0x28, 0x64, 0xe0, 0xca, 0x8e, 0xe2, 0x0e, 0xdb, 0x03, 0x24, 0x87, 0xdc, 0xe2,
	0x29, 0xb5, 0xd9, 0x18, 0x6a, 0x37, 0x1c, 0xab, 0x20, 0x05, 0x89, 0x26, 0x86, 0xc2, 0x9a, 0x94,
	0xa5, 0xdd, 0x03, 0x79, 0xf4, 0x51, 0x7c, 0x0e, 0x4f, 0x3e, 0x85, 0x24, 0xfd, 0xb3, 0x93, 0x5e,
	0xca, 0xef, 0xfb, 0x7e, 0x7f, 0xfa, 0xcb, 0x07, 0x90, 0x32, 0x46, 0xed, 0x25, 0xe2, 0xc2, 0xb6,
	0xd0, 0xa1, 0x23, 0x46, 0x52, 0xd7, 0x85, 0x45, 0xef, 0x52, 0x8a, 0x17, 0x5b, 0xf1, 0xaa, 0xb6,
	0xb0, 0x3c, 0x98, 0xca, 0x4c, 0xa6, 0x8d, 0x0a, 0x72, 0x61, 0x61, 0x6f, 0x80, 0x47, 0x0c, 0xbd,
	0xe1, 0xea, 0xba, 0xcb, 0x2b, 0x73, 0xc4, 0xb5, 0x36, 0x15, 0xaf, 0x72, 0xa3, 0x5b, 0xf3, 0x3c,
	0x05, 0x97, 0x0b, 0x29, 0xc5, 0xd6, 0x07, 0x32, 0x5d, 0x17, 0xf3, 0x18, 0x80, 0xd3, 0x66, 0x32,
	0x06, 0xa3, 0x5d, 0xb2, 0xdd, 0xb0, 0xdb, 0xd5, 0x62, 0xc5, 0xe2, 0xf0, 0x6c, 0x32, 0x02, 0x17,
	0xbb, 0xe4, 0x2e, 0x59, 0x3f, 0x25, 0xe1, 0xc0, 0x0d, 0x2c, 0xa1, 0xd1, 0x3d, 0x8b, 0xc3, 0xc0,
	0x0d, 0x8f, 0xec, 0x61, 0x9d, 0xb2, 0x38, 0x1c, 0x46, 0xdf, 0x03, 0x30, 0x7b, 0x33, 0x05, 0xfc,
	0xb7, 0x5b, 0x34, 0x3e, 0xfd, 0x69, 0xe3, 0xea, 0x6c, 0x06, 0xcf, 0x51, 0xeb, 0x50, 0x66, 0xcf,
	0xb5, 0x82, 0xe6, 0xa0, 0x90, 0x92, 0xda, 0x97, 0xed, 0xce, 0x51, 0xe6, 0xf6, 0x8f, 0xeb, 0xdc,
	0xf8, 0xef, 0x47, 0x30, 0x5c, 0x52, 0xfa, 0x19, 0x4c, 0x97, 0x4d, 0x14, 0x15, 0x16, 0x36, 0xd0,
	0xa1, 0x14, 0x43, 0xf7, 0x4e, 0xfb, 0xd5, 0xf1, 0x19, 0x15, 0x36, 0xeb, 0xf9, 0x2c, 0xc5, 0x99,
	0xe7, 0x7f, 0x82, 0x59, 0xb3, 0x24, 0x84, 0x0a, 0x4b, 0x48, 0xaf, 0x20, 0x24, 0xc5, 0x84, 0x78,
	0xcd, 0xeb, 0xb9, 0x2f, 0x86, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x17, 0x99, 0xc1, 0x4f, 0xb5,
	0x01, 0x00, 0x00,
}
