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

// The possible time types used by certain resources as an alternative to
// absolute timestamps.
type TimeTypeEnum_TimeType int32

const (
	// Not specified.
	TimeTypeEnum_UNSPECIFIED TimeTypeEnum_TimeType = 0
	// Used for return value only. Represents value unknown in this version.
	TimeTypeEnum_UNKNOWN TimeTypeEnum_TimeType = 1
	// As soon as possible.
	TimeTypeEnum_NOW TimeTypeEnum_TimeType = 2
	// An infinite point in the future.
	TimeTypeEnum_FOREVER TimeTypeEnum_TimeType = 3
)

var TimeTypeEnum_TimeType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "NOW",
	3: "FOREVER",
}

var TimeTypeEnum_TimeType_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"NOW":         2,
	"FOREVER":     3,
}

func (x TimeTypeEnum_TimeType) String() string {
	return proto.EnumName(TimeTypeEnum_TimeType_name, int32(x))
}

func (TimeTypeEnum_TimeType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_2bcb6847913a5158, []int{0, 0}
}

// Message describing time types.
type TimeTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TimeTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.TimeTypeEnum_TimeType", TimeTypeEnum_TimeType_name, TimeTypeEnum_TimeType_value)
	proto.RegisterType((*TimeTypeEnum)(nil), "google.ads.googleads.v3.enums.TimeTypeEnum")
}

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

var fileDescriptor_2bcb6847913a5158 = []byte{
	// 293 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
	0x18, 0xc7, 0x5d, 0x0b, 0x4e, 0x32, 0xc5, 0xd2, 0xa3, 0xb8, 0xc3, 0x76, 0x37, 0x39, 0xe4, 0x16,
	0x41, 0x68, 0xb5, 0x1b, 0x43, 0x48, 0xcb, 0xdc, 0x3a, 0x90, 0x82, 0x54, 0x1b, 0x42, 0x61, 0x4d,
	0xca, 0xd2, 0x0d, 0xf6, 0x3a, 0x1e, 0x7d, 0x14, 0x1f, 0xc3, 0xa3, 0x4f, 0x21, 0x49, 0x4c, 0x6f,
	0x7a, 0x09, 0xff, 0x7c, 0xff, 0x5f, 0xbe, 0xfc, 0xbf, 0x0f, 0xdc, 0x70, 0x29, 0xf9, 0x96, 0xa1,
	0xb2, 0x52, 0xc8, 0x4a, 0xad, 0x0e, 0x18, 0x31, 0xb1, 0x6f, 0x14, 0xea, 0xea, 0x86, 0xbd, 0x74,
	0xc7, 0x96, 0xc1, 0x76, 0x27, 0x3b, 0x19, 0x8e, 0x2d, 0x03, 0xcb, 0x4a, 0xc1, 0x1e, 0x87, 0x07,
	0x0c, 0x0d, 0x7e, 0x75, 0xed, 0xba, 0xb5, 0x35, 0x2a, 0x85, 0x90, 0x5d, 0xd9, 0xd5, 0x52, 0x28,
	0xfb, 0x78, 0x4a, 0xc1, 0xf9, 0xaa, 0x6e, 0xd8, 0xea, 0xd8, 0xb2, 0x44, 0xec, 0x9b, 0xe9, 0x1d,
	0x38, 0x73, 0xf7, 0xf0, 0x12, 0x8c, 0xd6, 0xf4, 0x29, 0x4b, 0xee, 0x17, 0xb3, 0x45, 0xf2, 0x10,
	0x9c, 0x84, 0x23, 0x30, 0x5c, 0xd3, 0x47, 0x9a, 0x6e, 0x68, 0x30, 0x08, 0x87, 0xc0, 0xa7, 0xe9,
	0x26, 0xf0, 0x74, 0x75, 0x96, 0x2e, 0x93, 0x3c, 0x59, 0x06, 0x7e, 0xfc, 0x35, 0x00, 0x93, 0x37,
	0xd9, 0xc0, 0x7f, 0x33, 0xc5, 0x17, 0xee, 0x8f, 0x4c, 0x87, 0xc8, 0x06, 0xcf, 0xf1, 0x2f, 0xcf,
	0xe5, 0xb6, 0x14, 0x1c, 0xca, 0x1d, 0x47, 0x9c, 0x09, 0x13, 0xd1, 0xad, 0xa0, 0xad, 0xd5, 0x1f,
	0x1b, 0xb9, 0x35, 0xe7, 0xbb, 0xe7, 0xcf, 0xa3, 0xe8, 0xc3, 0x1b, 0xcf, 0x6d, 0xab, 0xa8, 0x52,
	0xd0, 0x4a, 0xad, 0x72, 0x0c, 0xf5, 0x7c, 0xea, 0xd3, 0xf9, 0x45, 0x54, 0xa9, 0xa2, 0xf7, 0x8b,
	0x1c, 0x17, 0xc6, 0xff, 0xf6, 0x26, 0xb6, 0x48, 0x48, 0x54, 0x29, 0x42, 0x7a, 0x82, 0x90, 0x1c,
	0x13, 0x62, 0x98, 0xd7, 0x53, 0x13, 0x0c, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x16, 0x18, 0x32,
	0xc9, 0xa9, 0x01, 0x00, 0x00,
}
