// 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/v2/enums/system_managed_entity_source.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 system managed entity sources.
type SystemManagedResourceSourceEnum_SystemManagedResourceSource int32

const (
	// Not specified.
	SystemManagedResourceSourceEnum_UNSPECIFIED SystemManagedResourceSourceEnum_SystemManagedResourceSource = 0
	// Used for return value only. Represents value unknown in this version.
	SystemManagedResourceSourceEnum_UNKNOWN SystemManagedResourceSourceEnum_SystemManagedResourceSource = 1
	// Generated ad variations experiment ad.
	SystemManagedResourceSourceEnum_AD_VARIATIONS SystemManagedResourceSourceEnum_SystemManagedResourceSource = 2
)

// Enum value maps for SystemManagedResourceSourceEnum_SystemManagedResourceSource.
var (
	SystemManagedResourceSourceEnum_SystemManagedResourceSource_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "AD_VARIATIONS",
	}
	SystemManagedResourceSourceEnum_SystemManagedResourceSource_value = map[string]int32{
		"UNSPECIFIED":   0,
		"UNKNOWN":       1,
		"AD_VARIATIONS": 2,
	}
)

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

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

func (SystemManagedResourceSourceEnum_SystemManagedResourceSource) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_enumTypes[0].Descriptor()
}

func (SystemManagedResourceSourceEnum_SystemManagedResourceSource) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_enumTypes[0]
}

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

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

// Container for enum describing possible system managed entity sources.
type SystemManagedResourceSourceEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*SystemManagedResourceSourceEnum) ProtoMessage() {}

func (x *SystemManagedResourceSourceEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v2_enums_system_managed_entity_source_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 SystemManagedResourceSourceEnum.ProtoReflect.Descriptor instead.
func (*SystemManagedResourceSourceEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v2_enums_system_managed_entity_source_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_rawDesc = []byte{
	0x0a, 0x40, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x65,
	0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 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, 0x32, 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,
	0x71, 0x0a, 0x1f, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64,
	0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e,
	0x75, 0x6d, 0x22, 0x4e, 0x0a, 0x1b, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4d, 0x61, 0x6e, 0x61,
	0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63,
	0x65, 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,
	0x11, 0x0a, 0x0d, 0x41, 0x44, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53,
	0x10, 0x02, 0x42, 0xf3, 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, 0x32, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x1e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d,
	0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x6f, 0x75,
	0x72, 0x63, 0x65, 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, 0x32, 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, 0x32, 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, 0x32, 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,
	0x32, 0x3a, 0x3a, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_rawDescData = file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_goTypes = []interface{}{
	(SystemManagedResourceSourceEnum_SystemManagedResourceSource)(0), // 0: google.ads.googleads.v2.enums.SystemManagedResourceSourceEnum.SystemManagedResourceSource
	(*SystemManagedResourceSourceEnum)(nil),                          // 1: google.ads.googleads.v2.enums.SystemManagedResourceSourceEnum
}
var file_google_ads_googleads_v2_enums_system_managed_entity_source_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_v2_enums_system_managed_entity_source_proto_init() }
func file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_init() {
	if File_google_ads_googleads_v2_enums_system_managed_entity_source_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SystemManagedResourceSourceEnum); 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_v2_enums_system_managed_entity_source_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_system_managed_entity_source_proto = out.File
	file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_system_managed_entity_source_proto_depIdxs = nil
}
