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

const (
	// Not specified.
	FeedLinkStatusEnum_UNSPECIFIED FeedLinkStatusEnum_FeedLinkStatus = 0
	// Used for return value only. Represents value unknown in this version.
	FeedLinkStatusEnum_UNKNOWN FeedLinkStatusEnum_FeedLinkStatus = 1
	// Feed link is enabled.
	FeedLinkStatusEnum_ENABLED FeedLinkStatusEnum_FeedLinkStatus = 2
	// Feed link has been removed.
	FeedLinkStatusEnum_REMOVED FeedLinkStatusEnum_FeedLinkStatus = 3
)

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

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

func (x FeedLinkStatusEnum_FeedLinkStatus) String() string {
	return proto.EnumName(FeedLinkStatusEnum_FeedLinkStatus_name, int32(x))
}

func (FeedLinkStatusEnum_FeedLinkStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_0b8273670f863712, []int{0, 0}
}

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

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

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

var xxx_messageInfo_FeedLinkStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.FeedLinkStatusEnum_FeedLinkStatus", FeedLinkStatusEnum_FeedLinkStatus_name, FeedLinkStatusEnum_FeedLinkStatus_value)
	proto.RegisterType((*FeedLinkStatusEnum)(nil), "google.ads.googleads.v3.enums.FeedLinkStatusEnum")
}

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

var fileDescriptor_0b8273670f863712 = []byte{
	// 303 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4f, 0x4f, 0xfa, 0x30,
	0x18, 0xfe, 0x31, 0x92, 0x9f, 0x49, 0x49, 0x74, 0x99, 0x37, 0x23, 0x07, 0xf8, 0x00, 0xed, 0xa1,
	0x9e, 0xea, 0xa9, 0x93, 0x82, 0x44, 0x1c, 0x44, 0xc2, 0x4c, 0xcc, 0x22, 0xa9, 0xb6, 0x36, 0x0b,
	0xd0, 0x12, 0xba, 0xf1, 0x81, 0x3c, 0xfa, 0x51, 0xfc, 0x24, 0xc6, 0x4f, 0x61, 0xda, 0xb1, 0x25,
	0x1c, 0xf4, 0xb2, 0x3c, 0xef, 0xfb, 0xfc, 0xd9, 0xd3, 0x17, 0x5c, 0x29, 0x63, 0xd4, 0x5a, 0x22,
	0x2e, 0x2c, 0xaa, 0xa0, 0x43, 0x7b, 0x8c, 0xa4, 0x2e, 0x37, 0x16, 0xbd, 0x49, 0x29, 0x96, 0xeb,
	0x5c, 0xaf, 0x96, 0xb6, 0xe0, 0x45, 0x69, 0xe1, 0x76, 0x67, 0x0a, 0x13, 0x75, 0x2b, 0x29, 0xe4,
	0xc2, 0xc2, 0xc6, 0x05, 0xf7, 0x18, 0x7a, 0xd7, 0xc5, 0x65, 0x1d, 0xba, 0xcd, 0x11, 0xd7, 0xda,
	0x14, 0xbc, 0xc8, 0x8d, 0x3e, 0x98, 0xfb, 0xcf, 0x20, 0x1a, 0x4a, 0x29, 0x26, 0xb9, 0x5e, 0xcd,
	0x7d, 0x28, 0xd3, 0xe5, 0xa6, 0x7f, 0x0b, 0x4e, 0x8f, 0xb7, 0xd1, 0x19, 0xe8, 0x2c, 0x92, 0xf9,
	0x8c, 0xdd, 0x8c, 0x87, 0x63, 0x36, 0x08, 0xff, 0x45, 0x1d, 0x70, 0xb2, 0x48, 0xee, 0x92, 0xe9,
	0x63, 0x12, 0xb6, 0xdc, 0xc0, 0x12, 0x1a, 0x4f, 0xd8, 0x20, 0x0c, 0xdc, 0xf0, 0xc0, 0xee, 0xa7,
	0x29, 0x1b, 0x84, 0xed, 0xf8, 0xab, 0x05, 0x7a, 0xaf, 0x66, 0x03, 0xff, 0xec, 0x18, 0x9f, 0x1f,
	0xff, 0x6d, 0xe6, 0xaa, 0xcd, 0x5a, 0x4f, 0xf1, 0xc1, 0xa5, 0xcc, 0x9a, 0x6b, 0x05, 0xcd, 0x4e,
	0x21, 0x25, 0xb5, 0x2f, 0x5e, 0xdf, 0x67, 0x9b, 0xdb, 0x5f, 0xce, 0x75, 0xed, 0xbf, 0xef, 0x41,
	0x7b, 0x44, 0xe9, 0x47, 0xd0, 0x1d, 0x55, 0x51, 0x54, 0x58, 0x58, 0x41, 0x87, 0x52, 0x0c, 0xdd,
	0x7b, 0xed, 0x67, 0xcd, 0x67, 0x54, 0xd8, 0xac, 0xe1, 0xb3, 0x14, 0x67, 0x9e, 0xff, 0x0e, 0x7a,
	0xd5, 0x92, 0x10, 0x2a, 0x2c, 0x21, 0x8d, 0x82, 0x90, 0x14, 0x13, 0xe2, 0x35, 0x2f, 0xff, 0x7d,
	0x31, 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0xaa, 0x5a, 0xf6, 0xca, 0xc6, 0x01, 0x00, 0x00,
}
