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

// Describes the possible statuses for a link between a Google Ads customer
// and a Google Merchant Center account.
type MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus int32

const (
	// Not specified.
	MerchantCenterLinkStatusEnum_UNSPECIFIED MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus = 0
	// Used for return value only. Represents value unknown in this version.
	MerchantCenterLinkStatusEnum_UNKNOWN MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus = 1
	// The link is enabled.
	MerchantCenterLinkStatusEnum_ENABLED MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus = 2
	// The link has no effect. It was proposed by the Merchant Center Account
	// owner and hasn't been confirmed by the customer.
	MerchantCenterLinkStatusEnum_PENDING MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus = 3
)

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

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

func (x MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus) String() string {
	return proto.EnumName(MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus_name, int32(x))
}

func (MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_8efd1c04a55e69bb, []int{0, 0}
}

// Container for enum describing possible statuses of a Google Merchant Center
// link.
type MerchantCenterLinkStatusEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MerchantCenterLinkStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus", MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus_name, MerchantCenterLinkStatusEnum_MerchantCenterLinkStatus_value)
	proto.RegisterType((*MerchantCenterLinkStatusEnum)(nil), "google.ads.googleads.v3.enums.MerchantCenterLinkStatusEnum")
}

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

var fileDescriptor_8efd1c04a55e69bb = []byte{
	// 313 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xc1, 0x4e, 0x02, 0x31,
	0x14, 0x94, 0x25, 0xd1, 0xa4, 0x1c, 0xdc, 0x70, 0x32, 0x06, 0x0e, 0xf0, 0x01, 0xed, 0xa1, 0xb7,
	0x7a, 0x30, 0x5d, 0xa8, 0x84, 0x88, 0x75, 0x23, 0x01, 0x13, 0xb3, 0x09, 0xa9, 0x6c, 0x53, 0x37,
	0xb0, 0x2d, 0xd9, 0x16, 0x3e, 0xc8, 0xa3, 0x9f, 0xe2, 0xa7, 0x78, 0xf4, 0x0b, 0x4c, 0xbb, 0xc0,
	0x6d, 0xbd, 0x6c, 0xe6, 0xed, 0xbc, 0x37, 0x33, 0x1d, 0x70, 0xaf, 0x8c, 0x51, 0x5b, 0x89, 0x44,
	0x6e, 0x51, 0x0d, 0x3d, 0x3a, 0x60, 0x24, 0xf5, 0xbe, 0xb4, 0xa8, 0x94, 0xd5, 0xfa, 0x43, 0x68,
	0xb7, 0x5a, 0x4b, 0xed, 0x64, 0xb5, 0xda, 0x16, 0x7a, 0xb3, 0xb2, 0x4e, 0xb8, 0xbd, 0x85, 0xbb,
	0xca, 0x38, 0xd3, 0xed, 0xd7, 0x57, 0x50, 0xe4, 0x16, 0x9e, 0x05, 0xe0, 0x01, 0xc3, 0x20, 0x70,
	0xdb, 0x3b, 0xe9, 0xef, 0x0a, 0x24, 0xb4, 0x36, 0x4e, 0xb8, 0xc2, 0xe8, 0xe3, 0xf1, 0xb0, 0x02,
	0xbd, 0xa7, 0xa3, 0xc3, 0x28, 0x18, 0xcc, 0x0a, 0xbd, 0x99, 0x07, 0x79, 0xa6, 0xf7, 0xe5, 0xf0,
	0x05, 0xdc, 0x34, 0xf1, 0xdd, 0x6b, 0xd0, 0x59, 0xf0, 0x79, 0xca, 0x46, 0xd3, 0x87, 0x29, 0x1b,
	0xc7, 0x17, 0xdd, 0x0e, 0xb8, 0x5a, 0xf0, 0x47, 0xfe, 0xfc, 0xca, 0xe3, 0x96, 0x1f, 0x18, 0xa7,
	0xc9, 0x8c, 0x8d, 0xe3, 0xc8, 0x0f, 0x29, 0xe3, 0xe3, 0x29, 0x9f, 0xc4, 0xed, 0xe4, 0xb7, 0x05,
	0x06, 0x6b, 0x53, 0xc2, 0x7f, 0x73, 0x27, 0xfd, 0x26, 0xdf, 0xd4, 0x07, 0x4f, 0x5b, 0x6f, 0xc9,
	0xf1, 0x5e, 0x99, 0xad, 0xd0, 0x0a, 0x9a, 0x4a, 0x21, 0x25, 0x75, 0x78, 0xd6, 0xa9, 0xc8, 0x5d,
	0x61, 0x1b, 0x7a, 0xbd, 0x0b, 0xdf, 0xcf, 0xa8, 0x3d, 0xa1, 0xf4, 0x2b, 0xea, 0x4f, 0x6a, 0x29,
	0x9a, 0x5b, 0x58, 0x43, 0x8f, 0x96, 0x18, 0xfa, 0x0e, 0xec, 0xf7, 0x89, 0xcf, 0x68, 0x6e, 0xb3,
	0x33, 0x9f, 0x2d, 0x71, 0x16, 0xf8, 0x9f, 0x68, 0x50, 0xff, 0x24, 0x84, 0xe6, 0x96, 0x90, 0xf3,
	0x06, 0x21, 0x4b, 0x4c, 0x48, 0xd8, 0x79, 0xbf, 0x0c, 0xc1, 0xf0, 0x5f, 0x00, 0x00, 0x00, 0xff,
	0xff, 0x86, 0x38, 0x4f, 0x57, 0xef, 0x01, 0x00, 0x00,
}
