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

// 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
)

var KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	3: "NEXT_WEEK",
	4: "NEXT_MONTH",
	5: "NEXT_QUARTER",
}

var KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_value = map[string]int32{
	"UNSPECIFIED":  0,
	"UNKNOWN":      1,
	"NEXT_WEEK":    3,
	"NEXT_MONTH":   4,
	"NEXT_QUARTER": 5,
}

func (x KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval) String() string {
	return proto.EnumName(KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_name, int32(x))
}

func (KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7a59f184ceefa6df, []int{0, 0}
}

// Container for enumeration of forecast intervals.
type KeywordPlanForecastIntervalEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_KeywordPlanForecastIntervalEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval", KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_name, KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_value)
	proto.RegisterType((*KeywordPlanForecastIntervalEnum)(nil), "google.ads.googleads.v3.enums.KeywordPlanForecastIntervalEnum")
}

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

var fileDescriptor_7a59f184ceefa6df = []byte{
	// 340 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4e, 0xf3, 0x30,
	0x10, 0xfd, 0xd2, 0x7e, 0x80, 0x70, 0xf9, 0x89, 0xb2, 0x04, 0x2a, 0x68, 0x0f, 0xe0, 0x2c, 0xb2,
	0x33, 0xab, 0x14, 0xdc, 0x52, 0x55, 0xa4, 0xa1, 0xf4, 0x07, 0xa1, 0x48, 0x91, 0x69, 0x8c, 0x15,
	0xe1, 0xda, 0x51, 0x9c, 0x16, 0x71, 0x0a, 0xee, 0xc0, 0x92, 0xa3, 0x70, 0x14, 0xf6, 0xec, 0x51,
	0xec, 0xb6, 0x3b, 0xb2, 0xb1, 0xde, 0x78, 0x66, 0xde, 0x9b, 0xf7, 0x40, 0x87, 0x49, 0xc9, 0x38,
	0x75, 0x49, 0xa2, 0x5c, 0x03, 0x4b, 0xb4, 0xf2, 0x5c, 0x2a, 0x96, 0x0b, 0xe5, 0xbe, 0xd0, 0xb7,
	0x57, 0x99, 0x27, 0x71, 0xc6, 0x89, 0x88, 0x9f, 0x65, 0x4e, 0xe7, 0x44, 0x15, 0x71, 0x2a, 0x0a,
	0x9a, 0xaf, 0x08, 0x87, 0x59, 0x2e, 0x0b, 0xe9, 0x34, 0xcd, 0x22, 0x24, 0x89, 0x82, 0x5b, 0x0e,
	0xb8, 0xf2, 0xa0, 0xe6, 0x38, 0x39, 0xdb, 0x48, 0x64, 0xa9, 0x4b, 0x84, 0x90, 0x05, 0x29, 0x52,
	0x29, 0x94, 0x59, 0x6e, 0xbf, 0x5b, 0xe0, 0x7c, 0x60, 0x54, 0x42, 0x4e, 0x44, 0x77, 0xad, 0xd1,
	0x5f, 0x4b, 0x60, 0xb1, 0x5c, 0xb4, 0x39, 0x38, 0xad, 0x18, 0x71, 0x8e, 0x41, 0x63, 0x12, 0xdc,
	0x87, 0xf8, 0xaa, 0xdf, 0xed, 0xe3, 0x6b, 0xfb, 0x9f, 0xd3, 0x00, 0x7b, 0x93, 0x60, 0x10, 0x0c,
	0x67, 0x81, 0x6d, 0x39, 0x87, 0x60, 0x3f, 0xc0, 0x0f, 0xe3, 0x78, 0x86, 0xf1, 0xc0, 0xae, 0x3b,
	0x47, 0x00, 0xe8, 0xf2, 0x76, 0x18, 0x8c, 0x6f, 0xec, 0xff, 0x8e, 0x0d, 0x0e, 0x74, 0x7d, 0x37,
	0xf1, 0x47, 0x63, 0x3c, 0xb2, 0x77, 0x3a, 0x3f, 0x16, 0x68, 0xcd, 0xe5, 0x02, 0x56, 0xba, 0xea,
	0x5c, 0x54, 0x5c, 0x14, 0x96, 0xce, 0x42, 0xeb, 0x71, 0x1d, 0x2e, 0x64, 0x92, 0x13, 0xc1, 0xa0,
	0xcc, 0x99, 0xcb, 0xa8, 0xd0, 0xbe, 0x37, 0x61, 0x67, 0xa9, 0xfa, 0x23, 0xfb, 0x4b, 0xfd, 0x7e,
	0xd4, 0xea, 0x3d, 0xdf, 0xff, 0xac, 0x35, 0x7b, 0x86, 0xca, 0x4f, 0x14, 0x34, 0xb0, 0x44, 0x53,
	0x0f, 0x96, 0x01, 0xa9, 0xaf, 0x4d, 0x3f, 0xf2, 0x13, 0x15, 0x6d, 0xfb, 0xd1, 0xd4, 0x8b, 0x74,
	0xff, 0xbb, 0xd6, 0x32, 0x9f, 0x08, 0xf9, 0x89, 0x42, 0x68, 0x3b, 0x81, 0xd0, 0xd4, 0x43, 0x48,
	0xcf, 0x3c, 0xed, 0xea, 0xc3, 0xbc, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6b, 0x04, 0x05, 0xe3,
	0x13, 0x02, 0x00, 0x00,
}
