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

var CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "RANDOM_QUERY",
	3: "COOKIE",
}

var CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType_value = map[string]int32{
	"UNSPECIFIED":  0,
	"UNKNOWN":      1,
	"RANDOM_QUERY": 2,
	"COOKIE":       3,
}

func (x CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType) String() string {
	return proto.EnumName(CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType_name, int32(x))
}

func (CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_8a5c058d201e2ee9, []int{0, 0}
}

// Container for enum describing campaign experiment traffic split type.
type CampaignExperimentTrafficSplitTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CampaignExperimentTrafficSplitTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType", CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType_name, CampaignExperimentTrafficSplitTypeEnum_CampaignExperimentTrafficSplitType_value)
	proto.RegisterType((*CampaignExperimentTrafficSplitTypeEnum)(nil), "google.ads.googleads.v3.enums.CampaignExperimentTrafficSplitTypeEnum")
}

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

var fileDescriptor_8a5c058d201e2ee9 = []byte{
	// 340 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x51, 0xbd, 0x4e, 0xeb, 0x30,
	0x18, 0xbd, 0x49, 0xa5, 0x5e, 0xc9, 0xbd, 0xd2, 0x8d, 0x32, 0x22, 0x3a, 0xb4, 0x03, 0x6c, 0xce,
	0x90, 0xcd, 0x4c, 0x69, 0x1b, 0xaa, 0x52, 0x91, 0x94, 0xfe, 0x21, 0x50, 0xa4, 0x60, 0x1a, 0xd7,
	0xb2, 0xd4, 0xd8, 0x56, 0xec, 0x56, 0xf4, 0x15, 0x78, 0x0c, 0x46, 0x1e, 0x85, 0x47, 0xe1, 0x19,
	0x18, 0x50, 0xe2, 0x36, 0x1b, 0x74, 0xb1, 0x8e, 0x7c, 0x8e, 0xcf, 0xf9, 0xce, 0x67, 0x70, 0x43,
	0x85, 0xa0, 0x1b, 0xe2, 0xe1, 0x4c, 0x79, 0x06, 0x96, 0x68, 0xe7, 0x7b, 0x84, 0x6f, 0x73, 0xe5,
	0xad, 0x70, 0x2e, 0x31, 0xa3, 0x3c, 0x25, 0x2f, 0x92, 0x14, 0x2c, 0x27, 0x5c, 0xa7, 0xba, 0xc0,
	0xeb, 0x35, 0x5b, 0xa5, 0x4a, 0x6e, 0x98, 0x4e, 0xf5, 0x5e, 0x12, 0x28, 0x0b, 0xa1, 0x85, 0xdb,
	0x36, 0x06, 0x10, 0x67, 0x0a, 0xd6, 0x5e, 0x70, 0xe7, 0xc3, 0xca, 0xeb, 0xec, 0xfc, 0x18, 0x25,
	0x99, 0x87, 0x39, 0x17, 0x1a, 0x6b, 0x26, 0xb8, 0x32, 0x8f, 0xbb, 0xaf, 0x16, 0xb8, 0xe8, 0x1f,
	0xd2, 0xc2, 0x3a, 0x6c, 0x6e, 0xb2, 0x66, 0x65, 0xd4, 0x7c, 0x2f, 0x49, 0xc8, 0xb7, 0x79, 0xf7,
	0x09, 0x74, 0x4f, 0x2b, 0xdd, 0xff, 0xa0, 0xb5, 0x88, 0x66, 0x93, 0xb0, 0x3f, 0xba, 0x1e, 0x85,
	0x03, 0xe7, 0x8f, 0xdb, 0x02, 0x7f, 0x17, 0xd1, 0x38, 0x8a, 0xef, 0x23, 0xc7, 0x72, 0x1d, 0xf0,
	0x6f, 0x1a, 0x44, 0x83, 0xf8, 0x36, 0xbd, 0x5b, 0x84, 0xd3, 0x07, 0xc7, 0x76, 0x01, 0x68, 0xf6,
	0xe3, 0x78, 0x3c, 0x0a, 0x9d, 0x46, 0xef, 0xcb, 0x02, 0x9d, 0x95, 0xc8, 0xe1, 0xaf, 0x85, 0x7a,
	0x97, 0xa7, 0xa7, 0x98, 0x94, 0xdd, 0x26, 0xd6, 0x63, 0xef, 0xe0, 0x44, 0xc5, 0x06, 0x73, 0x0a,
	0x45, 0x41, 0x3d, 0x4a, 0x78, 0xd5, 0xfc, 0xb8, 0x76, 0xc9, 0xd4, 0x0f, 0xbf, 0x70, 0x55, 0x9d,
	0x6f, 0x76, 0x63, 0x18, 0x04, 0xef, 0x76, 0x7b, 0x68, 0xac, 0x82, 0x4c, 0x41, 0x03, 0x4b, 0xb4,
	0xf4, 0x61, 0xb9, 0x1b, 0xf5, 0x71, 0xe4, 0x93, 0x20, 0x53, 0x49, 0xcd, 0x27, 0x4b, 0x3f, 0xa9,
	0xf8, 0x4f, 0xbb, 0x63, 0x2e, 0x11, 0x0a, 0x32, 0x85, 0x50, 0xad, 0x40, 0x68, 0xe9, 0x23, 0x54,
	0x69, 0x9e, 0x9b, 0xd5, 0x60, 0xfe, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x31, 0x13, 0x45, 0x71,
	0x1d, 0x02, 0x00, 0x00,
}
