// 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/reach_plan_ad_length.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

// Possible ad length values.
type ReachPlanAdLengthEnum_ReachPlanAdLength int32

const (
	// Not specified.
	ReachPlanAdLengthEnum_UNSPECIFIED ReachPlanAdLengthEnum_ReachPlanAdLength = 0
	// The value is unknown in this version.
	ReachPlanAdLengthEnum_UNKNOWN ReachPlanAdLengthEnum_ReachPlanAdLength = 1
	// 6 seconds long ad.
	ReachPlanAdLengthEnum_SIX_SECONDS ReachPlanAdLengthEnum_ReachPlanAdLength = 2
	// 15 or 20 seconds long ad.
	ReachPlanAdLengthEnum_FIFTEEN_OR_TWENTY_SECONDS ReachPlanAdLengthEnum_ReachPlanAdLength = 3
	// More than 20 seconds long ad.
	ReachPlanAdLengthEnum_TWENTY_SECONDS_OR_MORE ReachPlanAdLengthEnum_ReachPlanAdLength = 4
)

// Enum value maps for ReachPlanAdLengthEnum_ReachPlanAdLength.
var (
	ReachPlanAdLengthEnum_ReachPlanAdLength_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "SIX_SECONDS",
		3: "FIFTEEN_OR_TWENTY_SECONDS",
		4: "TWENTY_SECONDS_OR_MORE",
	}
	ReachPlanAdLengthEnum_ReachPlanAdLength_value = map[string]int32{
		"UNSPECIFIED":               0,
		"UNKNOWN":                   1,
		"SIX_SECONDS":               2,
		"FIFTEEN_OR_TWENTY_SECONDS": 3,
		"TWENTY_SECONDS_OR_MORE":    4,
	}
)

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

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

func (ReachPlanAdLengthEnum_ReachPlanAdLength) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_enumTypes[0].Descriptor()
}

func (ReachPlanAdLengthEnum_ReachPlanAdLength) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_enumTypes[0]
}

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

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

// Message describing length of a plannable video ad.
type ReachPlanAdLengthEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*ReachPlanAdLengthEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v2_enums_reach_plan_ad_length_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_rawDesc = []byte{
	0x0a, 0x38, 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,
	0x72, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x61, 0x64, 0x5f, 0x6c, 0x65,
	0x6e, 0x67, 0x74, 0x68, 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, 0x96, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x61, 0x63,
	0x68, 0x50, 0x6c, 0x61, 0x6e, 0x41, 0x64, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x45, 0x6e, 0x75,
	0x6d, 0x22, 0x7d, 0x0a, 0x11, 0x52, 0x65, 0x61, 0x63, 0x68, 0x50, 0x6c, 0x61, 0x6e, 0x41, 0x64,
	0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 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, 0x0f, 0x0a, 0x0b, 0x53, 0x49, 0x58, 0x5f, 0x53, 0x45, 0x43, 0x4f,
	0x4e, 0x44, 0x53, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x46, 0x49, 0x46, 0x54, 0x45, 0x45, 0x4e,
	0x5f, 0x4f, 0x52, 0x5f, 0x54, 0x57, 0x45, 0x4e, 0x54, 0x59, 0x5f, 0x53, 0x45, 0x43, 0x4f, 0x4e,
	0x44, 0x53, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x57, 0x45, 0x4e, 0x54, 0x59, 0x5f, 0x53,
	0x45, 0x43, 0x4f, 0x4e, 0x44, 0x53, 0x5f, 0x4f, 0x52, 0x5f, 0x4d, 0x4f, 0x52, 0x45, 0x10, 0x04,
	0x42, 0xeb, 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, 0x16, 0x52, 0x65, 0x61, 0x63, 0x68, 0x50, 0x6c, 0x61,
	0x6e, 0x41, 0x64, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 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_reach_plan_ad_length_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_rawDescData = file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_goTypes = []interface{}{
	(ReachPlanAdLengthEnum_ReachPlanAdLength)(0), // 0: google.ads.googleads.v2.enums.ReachPlanAdLengthEnum.ReachPlanAdLength
	(*ReachPlanAdLengthEnum)(nil),                // 1: google.ads.googleads.v2.enums.ReachPlanAdLengthEnum
}
var file_google_ads_googleads_v2_enums_reach_plan_ad_length_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_reach_plan_ad_length_proto_init() }
func file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_init() {
	if File_google_ads_googleads_v2_enums_reach_plan_ad_length_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ReachPlanAdLengthEnum); 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_reach_plan_ad_length_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_reach_plan_ad_length_proto = out.File
	file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_reach_plan_ad_length_proto_depIdxs = nil
}
