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

// Enum listing the possible shared set statuses.
type SharedSetStatusEnum_SharedSetStatus int32

const (
	// Not specified.
	SharedSetStatusEnum_UNSPECIFIED SharedSetStatusEnum_SharedSetStatus = 0
	// Used for return value only. Represents value unknown in this version.
	SharedSetStatusEnum_UNKNOWN SharedSetStatusEnum_SharedSetStatus = 1
	// The shared set is enabled.
	SharedSetStatusEnum_ENABLED SharedSetStatusEnum_SharedSetStatus = 2
	// The shared set is removed and can no longer be used.
	SharedSetStatusEnum_REMOVED SharedSetStatusEnum_SharedSetStatus = 3
)

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

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

func (x SharedSetStatusEnum_SharedSetStatus) String() string {
	return proto.EnumName(SharedSetStatusEnum_SharedSetStatus_name, int32(x))
}

func (SharedSetStatusEnum_SharedSetStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_aa56d9c6516a1fd1, []int{0, 0}
}

// Container for enum describing types of shared set statuses.
type SharedSetStatusEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SharedSetStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.SharedSetStatusEnum_SharedSetStatus", SharedSetStatusEnum_SharedSetStatus_name, SharedSetStatusEnum_SharedSetStatus_value)
	proto.RegisterType((*SharedSetStatusEnum)(nil), "google.ads.googleads.v3.enums.SharedSetStatusEnum")
}

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

var fileDescriptor_aa56d9c6516a1fd1 = []byte{
	// 301 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcd, 0x4e, 0x32, 0x31,
	0x14, 0xfd, 0x18, 0x92, 0xcf, 0xa4, 0x2c, 0x98, 0xa0, 0x2b, 0x23, 0x0b, 0x78, 0x80, 0x76, 0xd1,
	0xb8, 0xa9, 0xab, 0x8e, 0x54, 0x42, 0xd4, 0x81, 0x38, 0x61, 0x4c, 0xcc, 0x24, 0x58, 0x6d, 0x53,
	0x49, 0xa0, 0x25, 0xdc, 0xc2, 0x03, 0xb9, 0xf4, 0x51, 0x7c, 0x13, 0x7d, 0x0a, 0xd3, 0x0e, 0xb0,
	0x20, 0xd1, 0xcd, 0xe4, 0xdc, 0x7b, 0x7e, 0xe6, 0xf4, 0xa2, 0x4b, 0xe3, 0x9c, 0x59, 0x68, 0x22,
	0x15, 0x90, 0x1a, 0x06, 0xb4, 0xa5, 0x44, 0xdb, 0xcd, 0x12, 0x08, 0xbc, 0xc9, 0xb5, 0x56, 0x33,
	0xd0, 0x7e, 0x06, 0x5e, 0xfa, 0x0d, 0xe0, 0xd5, 0xda, 0x79, 0xd7, 0xe9, 0xd6, 0x5a, 0x2c, 0x15,
	0xe0, 0x83, 0x0d, 0x6f, 0x29, 0x8e, 0xb6, 0xf3, 0x8b, 0x7d, 0xea, 0x6a, 0x4e, 0xa4, 0xb5, 0xce,
	0x4b, 0x3f, 0x77, 0x76, 0x67, 0xee, 0x3f, 0xa3, 0xd3, 0x22, 0xe6, 0x16, 0xda, 0x17, 0x31, 0x55,
	0xd8, 0xcd, 0xb2, 0x3f, 0x42, 0xed, 0xa3, 0x75, 0xa7, 0x8d, 0x5a, 0xd3, 0xbc, 0x98, 0x88, 0xeb,
	0xd1, 0xcd, 0x48, 0x0c, 0xd2, 0x7f, 0x9d, 0x16, 0x3a, 0x99, 0xe6, 0xb7, 0xf9, 0xf8, 0x31, 0x4f,
	0x1b, 0x61, 0x10, 0x39, 0xcf, 0xee, 0xc4, 0x20, 0x4d, 0xc2, 0xf0, 0x20, 0xee, 0xc7, 0xa5, 0x18,
	0xa4, 0xcd, 0xec, 0xab, 0x81, 0x7a, 0xaf, 0x6e, 0x89, 0xff, 0x6c, 0x99, 0x9d, 0x1d, 0xfd, 0x6e,
	0x12, 0xda, 0x4d, 0x1a, 0x4f, 0xd9, 0xce, 0x66, 0xdc, 0x42, 0x5a, 0x83, 0xdd, 0xda, 0x10, 0xa3,
	0x6d, 0xec, 0xbe, 0xbf, 0xd1, 0x6a, 0x0e, 0xbf, 0x9c, 0xec, 0x2a, 0x7e, 0xdf, 0x93, 0xe6, 0x90,
	0xf3, 0x8f, 0xa4, 0x3b, 0xac, 0xa3, 0xb8, 0x02, 0x5c, 0xc3, 0x80, 0x4a, 0x8a, 0xc3, 0x8b, 0xe1,
	0x73, 0xcf, 0x57, 0x5c, 0x41, 0x75, 0xe0, 0xab, 0x92, 0x56, 0x91, 0xff, 0x4e, 0x7a, 0xf5, 0x92,
	0x31, 0xae, 0x80, 0xb1, 0x83, 0x82, 0xb1, 0x92, 0x32, 0x16, 0x35, 0x2f, 0xff, 0x63, 0x31, 0xfa,
	0x13, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x90, 0xf6, 0xeb, 0xca, 0x01, 0x00, 0x00,
}
