// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v0/enums/keyword_plan_forecast_interval.proto

package enums // import "google.golang.org/genproto/googleapis/ads/googleads/v0/enums"

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"

// 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.ProtoPackageIsVersion2 // 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_keyword_plan_forecast_interval_48060c037199c7ef, []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_keyword_plan_forecast_interval_48060c037199c7ef, []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 (dst *KeywordPlanForecastIntervalEnum) XXX_Merge(src proto.Message) {
	xxx_messageInfo_KeywordPlanForecastIntervalEnum.Merge(dst, 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.RegisterType((*KeywordPlanForecastIntervalEnum)(nil), "google.ads.googleads.v0.enums.KeywordPlanForecastIntervalEnum")
	proto.RegisterEnum("google.ads.googleads.v0.enums.KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval", KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_name, KeywordPlanForecastIntervalEnum_KeywordPlanForecastInterval_value)
}

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

var fileDescriptor_keyword_plan_forecast_interval_48060c037199c7ef = []byte{
	// 303 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4b, 0x4e, 0xc3, 0x30,
	0x14, 0x45, 0x49, 0xcb, 0x47, 0xb8, 0x7c, 0x2c, 0x4f, 0x51, 0x05, 0x74, 0x01, 0x4e, 0x24, 0x86,
	0x8c, 0x52, 0x70, 0x4b, 0x55, 0xe1, 0x86, 0xd2, 0x0f, 0x42, 0x91, 0x22, 0xd3, 0x18, 0xab, 0xc2,
	0xb5, 0xa3, 0x38, 0x0d, 0x62, 0x15, 0xec, 0x81, 0x21, 0x4b, 0x61, 0xc6, 0x8e, 0x50, 0x9c, 0xb4,
	0x33, 0x32, 0x89, 0xee, 0xd3, 0x8d, 0x8f, 0x9f, 0x0f, 0xe8, 0x0a, 0xad, 0x85, 0xe4, 0x2e, 0x8b,
	0x8d, 0x5b, 0xc6, 0x22, 0xe5, 0x9e, 0xcb, 0xd5, 0x7a, 0x65, 0xdc, 0x37, 0xfe, 0xf1, 0xae, 0xd3,
	0x38, 0x4a, 0x24, 0x53, 0xd1, 0xab, 0x4e, 0xf9, 0x82, 0x99, 0x2c, 0x5a, 0xaa, 0x8c, 0xa7, 0x39,
	0x93, 0x38, 0x49, 0x75, 0xa6, 0x51, 0xbb, 0x3c, 0x88, 0x59, 0x6c, 0xf0, 0x96, 0x81, 0x73, 0x0f,
	0x5b, 0x46, 0xe7, 0xd3, 0x01, 0xe7, 0xc3, 0x92, 0x13, 0x48, 0xa6, 0x7a, 0x15, 0x65, 0x50, 0x41,
	0x88, 0x5a, 0xaf, 0x3a, 0x12, 0x9c, 0xd5, 0xfc, 0x82, 0x4e, 0x41, 0x6b, 0x4a, 0x1f, 0x03, 0x72,
	0x33, 0xe8, 0x0d, 0xc8, 0x2d, 0xdc, 0x41, 0x2d, 0x70, 0x30, 0xa5, 0x43, 0x3a, 0x9a, 0x53, 0xe8,
	0xa0, 0x63, 0x70, 0x48, 0xc9, 0xd3, 0x24, 0x9a, 0x13, 0x32, 0x84, 0x4d, 0x74, 0x02, 0x80, 0x1d,
	0xef, 0x47, 0x74, 0x72, 0x07, 0x77, 0x11, 0x04, 0x47, 0x76, 0x7e, 0x98, 0xfa, 0xe3, 0x09, 0x19,
	0xc3, 0xbd, 0xee, 0xaf, 0x03, 0x2e, 0x17, 0x7a, 0x85, 0x6b, 0xf7, 0xee, 0x5e, 0xd4, 0x6c, 0x14,
	0x14, 0x0f, 0x0f, 0x9c, 0xe7, 0x4a, 0x1f, 0x16, 0x5a, 0x32, 0x25, 0xb0, 0x4e, 0x85, 0x2b, 0xb8,
	0xb2, 0x5a, 0x36, 0x3a, 0x93, 0xa5, 0xf9, 0xc7, 0xee, 0xb5, 0xfd, 0x7e, 0x35, 0x9a, 0x7d, 0xdf,
	0xff, 0x6e, 0xb4, 0xfb, 0x25, 0xca, 0x8f, 0x0d, 0x2e, 0x63, 0x91, 0x66, 0x1e, 0x2e, 0x04, 0x99,
	0x9f, 0x4d, 0x1f, 0xfa, 0xb1, 0x09, 0xb7, 0x7d, 0x38, 0xf3, 0x42, 0xdb, 0xbf, 0xec, 0xdb, 0x4b,
	0xaf, 0xfe, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x3c, 0x2c, 0x01, 0xd1, 0x01, 0x00, 0x00,
}
