// 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/campaign_experiment_traffic_split_type.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 of strategies for splitting traffic between base and experiment
// campaigns in campaign experiment.
type CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType int32

const (
	// Not specified.
	CampaignExperimentTrafficSplitTypeEnum_UNSPECIFIED CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType = 0
	// Used for return value only. Represents value unknown in this version.
	CampaignExperimentTrafficSplitTypeEnum_UNKNOWN CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType = 1
	// Traffic is randomly assigned to the base or experiment arm for each
	// query, independent of previous assignments for the same user.
	CampaignExperimentTrafficSplitTypeEnum_RANDOM_QUERY CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType = 2
	// Traffic is split using cookies to keep users in the same arm (base or
	// experiment) of the experiment.
	CampaignExperimentTrafficSplitTypeEnum_COOKIE CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType = 3
)

// Enum value maps for CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType.
var (
	CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "RANDOM_QUERY",
		3: "COOKIE",
	}
	CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType_value = map[string]int32{
		"UNSPECIFIED":  0,
		"UNKNOWN":      1,
		"RANDOM_QUERY": 2,
		"COOKIE":       3,
	}
)

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

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

func (CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_enumTypes[0].Descriptor()
}

func (CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_enumTypes[0]
}

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

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

// Container for enum describing campaign experiment traffic split type.
type CampaignExperimentTrafficSplitTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*CampaignExperimentTrafficSplitTypeEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_rawDesc = []byte{
	0x0a, 0x4a, 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,
	0x63, 0x61, 0x6d, 0x70, 0x61, 0x69, 0x67, 0x6e, 0x5f, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d,
	0x65, 0x6e, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x73, 0x70, 0x6c, 0x69,
	0x74, 0x5f, 0x74, 0x79, 0x70, 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, 0x8a, 0x01, 0x0a, 0x26, 0x43, 0x61,
	0x6d, 0x70, 0x61, 0x69, 0x67, 0x6e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
	0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65,
	0x45, 0x6e, 0x75, 0x6d, 0x22, 0x60, 0x0a, 0x22, 0x43, 0x61, 0x6d, 0x70, 0x61, 0x69, 0x67, 0x6e,
	0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69,
	0x63, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x54, 0x79, 0x70, 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, 0x10, 0x0a, 0x0c, 0x52, 0x41, 0x4e, 0x44,
	0x4f, 0x4d, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f,
	0x4f, 0x4b, 0x49, 0x45, 0x10, 0x03, 0x42, 0xfc, 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, 0x27, 0x43, 0x61,
	0x6d, 0x70, 0x61, 0x69, 0x67, 0x6e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
	0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x54, 0x79, 0x70, 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_campaign_experiment_traffic_split_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_rawDescData = file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_goTypes = []interface{}{
	(CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType)(0), // 0: google.ads.googleads.v2.enums.CampaignExperimentTrafficSplitTypeEnum.CampaignExperimentTrafficSplitType
	(*CampaignExperimentTrafficSplitTypeEnum)(nil),                                 // 1: google.ads.googleads.v2.enums.CampaignExperimentTrafficSplitTypeEnum
}
var file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_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_campaign_experiment_traffic_split_type_proto_init() }
func file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_init() {
	if File_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CampaignExperimentTrafficSplitTypeEnum); 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_campaign_experiment_traffic_split_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto = out.File
	file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_campaign_experiment_traffic_split_type_proto_depIdxs = nil
}
