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

// Forecast intervals.
type KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval int32

const (
	// Not specified.
	KeywordPlanForecastIntervalEnum_UNSPECIFIED KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval = 0
	// The value is unknown in this version.
	KeywordPlanForecastIntervalEnum_UNKNOWN KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval = 1
	// The next week date range for keyword plan. The next week is based
	// on the default locale of the user's account and is mostly SUN-SAT or
	// MON-SUN.
	// This can be different from next-7 days.
	KeywordPlanForecastIntervalEnum_NEXT_WEEK KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval = 3
	// The next month date range for keyword plan.
	KeywordPlanForecastIntervalEnum_NEXT_MONTH KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval = 4
	// The next quarter date range for keyword plan.
	KeywordPlanForecastIntervalEnum_NEXT_QUARTER KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval = 5
)

// Enum value maps for KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval.
var (
	KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		3: "NEXT_WEEK",
		4: "NEXT_MONTH",
		5: "NEXT_QUARTER",
	}
	KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_value = map[string]int32{
		"UNSPECIFIED":  0,
		"UNKNOWN":      1,
		"NEXT_WEEK":    3,
		"NEXT_MONTH":   4,
		"NEXT_QUARTER": 5,
	}
)

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

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

func (KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_enumTypes[0].Descriptor()
}

func (KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_enumTypes[0]
}

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

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

// Container for enumeration of forecast intervals.
type KeywordPlanForecastIntervalEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*KeywordPlanForecastIntervalEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_rawDesc = []byte{
	0x0a, 0x42, 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,
	0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x72,
	0x65, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 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, 0x8f, 0x01, 0x0a, 0x1f, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x50, 0x6c, 0x61,
	0x6e, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,
	0x6c, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x6c, 0x0a, 0x1b, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64,
	0x50, 0x6c, 0x61, 0x6e, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65,
	0x72, 0x76, 0x61, 0x6c, 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, 0x0d, 0x0a, 0x09, 0x4e, 0x45, 0x58, 0x54, 0x5f, 0x57, 0x45, 0x45, 0x4b, 0x10,
	0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x45, 0x58, 0x54, 0x5f, 0x4d, 0x4f, 0x4e, 0x54, 0x48, 0x10,
	0x04, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x45, 0x58, 0x54, 0x5f, 0x51, 0x55, 0x41, 0x52, 0x54, 0x45,
	0x52, 0x10, 0x05, 0x42, 0xf5, 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, 0x20, 0x4b, 0x65, 0x79, 0x77, 0x6f,
	0x72, 0x64, 0x50, 0x6c, 0x61, 0x6e, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x49, 0x6e,
	0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 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_keyword_plan_forecast_interval_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_rawDescData = file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_goTypes = []interface{}{
	(KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval)(0), // 0: google.ads.googleads.v2.enums.KeywordPlanForecastIntervalEnum.KeywordPlanForecastInterval
	(*KeywordPlanForecastIntervalEnum)(nil),                          // 1: google.ads.googleads.v2.enums.KeywordPlanForecastIntervalEnum
}
var file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_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_keyword_plan_forecast_interval_proto_init() }
func file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_init() {
	if File_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*KeywordPlanForecastIntervalEnum); 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_keyword_plan_forecast_interval_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto = out.File
	file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_keyword_plan_forecast_interval_proto_depIdxs = nil
}
