// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/campaign_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 campaign shared set statuses.
type CampaignSharedSetStatusEnum_CampaignSharedSetStatus int32

const (
	// Not specified.
	CampaignSharedSetStatusEnum_UNSPECIFIED CampaignSharedSetStatusEnum_CampaignSharedSetStatus = 0
	// Used for return value only. Represents value unknown in this version.
	CampaignSharedSetStatusEnum_UNKNOWN CampaignSharedSetStatusEnum_CampaignSharedSetStatus = 1
	// The campaign shared set is enabled.
	CampaignSharedSetStatusEnum_ENABLED CampaignSharedSetStatusEnum_CampaignSharedSetStatus = 2
	// The campaign shared set is removed and can no longer be used.
	CampaignSharedSetStatusEnum_REMOVED CampaignSharedSetStatusEnum_CampaignSharedSetStatus = 3
)

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

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

func (x CampaignSharedSetStatusEnum_CampaignSharedSetStatus) String() string {
	return proto.EnumName(CampaignSharedSetStatusEnum_CampaignSharedSetStatus_name, int32(x))
}

func (CampaignSharedSetStatusEnum_CampaignSharedSetStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_0c4d96f92ce0bbad, []int{0, 0}
}

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

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

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

var xxx_messageInfo_CampaignSharedSetStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignSharedSetStatusEnum_CampaignSharedSetStatus", CampaignSharedSetStatusEnum_CampaignSharedSetStatus_name, CampaignSharedSetStatusEnum_CampaignSharedSetStatus_value)
	proto.RegisterType((*CampaignSharedSetStatusEnum)(nil), "google.ads.googleads.v3.enums.CampaignSharedSetStatusEnum")
}

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

var fileDescriptor_0c4d96f92ce0bbad = []byte{
	// 311 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x4b, 0xc3, 0x30,
	0x18, 0x75, 0x1d, 0x28, 0x74, 0x07, 0xcb, 0x2e, 0x82, 0x6e, 0x87, 0xed, 0x07, 0xa4, 0x87, 0xdc,
	0x22, 0x08, 0xe9, 0x16, 0xc7, 0x50, 0xbb, 0x69, 0x59, 0x05, 0x29, 0x8c, 0xb8, 0x84, 0x58, 0x58,
	0x93, 0xb2, 0x2f, 0xdb, 0x0f, 0xf2, 0xe8, 0x4f, 0xf1, 0xa7, 0x78, 0xf3, 0x1f, 0x48, 0xd2, 0x6d,
	0xb7, 0x79, 0x29, 0xef, 0xeb, 0xfb, 0xde, 0xfb, 0x5e, 0x5e, 0x78, 0xa7, 0x8c, 0x51, 0x6b, 0x19,
	0x73, 0x01, 0x71, 0x03, 0x1d, 0xda, 0xe1, 0x58, 0xea, 0x6d, 0x05, 0xf1, 0x8a, 0x57, 0x35, 0x2f,
	0x95, 0x5e, 0xc2, 0x07, 0xdf, 0x48, 0xb1, 0x04, 0x69, 0x97, 0x60, 0xb9, 0xdd, 0x02, 0xaa, 0x37,
	0xc6, 0x9a, 0x6e, 0xbf, 0x11, 0x21, 0x2e, 0x00, 0x1d, 0xf5, 0x68, 0x87, 0x91, 0xd7, 0x5f, 0xf7,
	0x0e, 0xf6, 0x75, 0x19, 0x73, 0xad, 0x8d, 0xe5, 0xb6, 0x34, 0x7a, 0x2f, 0x1e, 0xd6, 0xe1, 0xcd,
	0x68, 0x7f, 0x20, 0xf3, 0xfe, 0x99, 0xb4, 0x99, 0x77, 0x67, 0x7a, 0x5b, 0x0d, 0x9f, 0xc3, 0xab,
	0x13, 0x74, 0xf7, 0x32, 0xec, 0x2c, 0xd2, 0x6c, 0xce, 0x46, 0xd3, 0xfb, 0x29, 0x1b, 0x47, 0x67,
	0xdd, 0x4e, 0x78, 0xb1, 0x48, 0x1f, 0xd2, 0xd9, 0x6b, 0x1a, 0xb5, 0xdc, 0xc0, 0x52, 0x9a, 0x3c,
	0xb2, 0x71, 0x14, 0xb8, 0xe1, 0x85, 0x3d, 0xcd, 0x72, 0x36, 0x8e, 0xda, 0xc9, 0x6f, 0x2b, 0x1c,
	0xac, 0x4c, 0x85, 0xfe, 0x4d, 0x9d, 0xf4, 0x4e, 0x9c, 0x9d, 0xbb, 0xd4, 0xf3, 0xd6, 0x5b, 0xb2,
	0x97, 0x2b, 0xb3, 0xe6, 0x5a, 0x21, 0xb3, 0x51, 0xb1, 0x92, 0xda, 0xbf, 0xe9, 0x50, 0x62, 0x5d,
	0xc2, 0x89, 0x4e, 0x6f, 0xfd, 0xf7, 0x33, 0x68, 0x4f, 0x28, 0xfd, 0x0a, 0xfa, 0x93, 0xc6, 0x8a,
	0x0a, 0x40, 0x0d, 0x74, 0x28, 0xc7, 0xc8, 0x35, 0x00, 0xdf, 0x07, 0xbe, 0xa0, 0x02, 0x8a, 0x23,
	0x5f, 0xe4, 0xb8, 0xf0, 0xfc, 0x4f, 0x30, 0x68, 0x7e, 0x12, 0x42, 0x05, 0x10, 0x72, 0xdc, 0x20,
	0x24, 0xc7, 0x84, 0xf8, 0x9d, 0xf7, 0x73, 0x1f, 0x0c, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x68,
	0xd2, 0x25, 0x09, 0xeb, 0x01, 0x00, 0x00,
}
