// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/ads/googleads/v1/enums/shared_set_status.proto

package enums

import (
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// 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
)

// Enum value maps for SharedSetStatusEnum_SharedSetStatus.
var (
	SharedSetStatusEnum_SharedSetStatus_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "ENABLED",
		3: "REMOVED",
	}
	SharedSetStatusEnum_SharedSetStatus_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"ENABLED":     2,
		"REMOVED":     3,
	}
)

func (x SharedSetStatusEnum_SharedSetStatus) Enum() *SharedSetStatusEnum_SharedSetStatus {
	p := new(SharedSetStatusEnum_SharedSetStatus)
	*p = x
	return p
}

func (x SharedSetStatusEnum_SharedSetStatus) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (SharedSetStatusEnum_SharedSetStatus) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_shared_set_status_proto_enumTypes[0].Descriptor()
}

func (SharedSetStatusEnum_SharedSetStatus) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_shared_set_status_proto_enumTypes[0]
}

func (x SharedSetStatusEnum_SharedSetStatus) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use SharedSetStatusEnum_SharedSetStatus.Descriptor instead.
func (SharedSetStatusEnum_SharedSetStatus) EnumDescriptor() ([]byte, []int) {
	return file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDescGZIP(), []int{0, 0}
}

// Container for enum describing types of shared set statuses.
type SharedSetStatusEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *SharedSetStatusEnum) Reset() {
	*x = SharedSetStatusEnum{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_googleads_v1_enums_shared_set_status_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SharedSetStatusEnum) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SharedSetStatusEnum) ProtoMessage() {}

func (x *SharedSetStatusEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v1_enums_shared_set_status_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SharedSetStatusEnum.ProtoReflect.Descriptor instead.
func (*SharedSetStatusEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v1_enums_shared_set_status_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDesc = []byte{
	0x0a, 0x35, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75,
	0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2e, 0x76, 0x31,
	0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61,
	0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x22, 0x60, 0x0a, 0x13, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x53, 0x65,
	0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x49, 0x0a, 0x0f, 0x53,
	0x68, 0x61, 0x72, 0x65, 0x64, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f,
	0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
	0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07,
	0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x4d,
	0x4f, 0x56, 0x45, 0x44, 0x10, 0x03, 0x42, 0xe9, 0x01, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x61, 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x14, 0x53, 0x68,
	0x61, 0x72, 0x65, 0x64, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x72, 0x6f,
	0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c,
	0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x64, 0x73, 0x2f,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6e, 0x75,
	0x6d, 0x73, 0x3b, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0xa2, 0x02, 0x03, 0x47, 0x41, 0x41, 0xaa, 0x02,
	0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x41, 0x64, 0x73, 0x2e, 0x47, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x41, 0x64, 0x73, 0x2e, 0x56, 0x31, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0xca, 0x02,
	0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x41, 0x64, 0x73, 0x5c, 0x47, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x41, 0x64, 0x73, 0x5c, 0x56, 0x31, 0x5c, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0xea, 0x02,
	0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x47, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x56, 0x31, 0x3a, 0x3a, 0x45, 0x6e, 0x75,
	0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDescData = file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_shared_set_status_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_shared_set_status_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_shared_set_status_proto_goTypes = []interface{}{
	(SharedSetStatusEnum_SharedSetStatus)(0), // 0: google.ads.googleads.v1.enums.SharedSetStatusEnum.SharedSetStatus
	(*SharedSetStatusEnum)(nil),              // 1: google.ads.googleads.v1.enums.SharedSetStatusEnum
}
var file_google_ads_googleads_v1_enums_shared_set_status_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_google_ads_googleads_v1_enums_shared_set_status_proto_init() }
func file_google_ads_googleads_v1_enums_shared_set_status_proto_init() {
	if File_google_ads_googleads_v1_enums_shared_set_status_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_shared_set_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SharedSetStatusEnum); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_shared_set_status_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_shared_set_status_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_shared_set_status_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_shared_set_status_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_shared_set_status_proto = out.File
	file_google_ads_googleads_v1_enums_shared_set_status_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_shared_set_status_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_shared_set_status_proto_depIdxs = nil
}
