// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/date_range_error.proto

package errors

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

// Enum describing possible date range errors.
type DateRangeErrorEnum_DateRangeError int32

const (
	// Enum unspecified.
	DateRangeErrorEnum_UNSPECIFIED DateRangeErrorEnum_DateRangeError = 0
	// The received error code is not known in this version.
	DateRangeErrorEnum_UNKNOWN DateRangeErrorEnum_DateRangeError = 1
	// Invalid date.
	DateRangeErrorEnum_INVALID_DATE DateRangeErrorEnum_DateRangeError = 2
	// The start date was after the end date.
	DateRangeErrorEnum_START_DATE_AFTER_END_DATE DateRangeErrorEnum_DateRangeError = 3
	// Cannot set date to past time
	DateRangeErrorEnum_CANNOT_SET_DATE_TO_PAST DateRangeErrorEnum_DateRangeError = 4
	// A date was used that is past the system "last" date.
	DateRangeErrorEnum_AFTER_MAXIMUM_ALLOWABLE_DATE DateRangeErrorEnum_DateRangeError = 5
	// Trying to change start date on a resource that has started.
	DateRangeErrorEnum_CANNOT_MODIFY_START_DATE_IF_ALREADY_STARTED DateRangeErrorEnum_DateRangeError = 6
)

var DateRangeErrorEnum_DateRangeError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "INVALID_DATE",
	3: "START_DATE_AFTER_END_DATE",
	4: "CANNOT_SET_DATE_TO_PAST",
	5: "AFTER_MAXIMUM_ALLOWABLE_DATE",
	6: "CANNOT_MODIFY_START_DATE_IF_ALREADY_STARTED",
}

var DateRangeErrorEnum_DateRangeError_value = map[string]int32{
	"UNSPECIFIED":                  0,
	"UNKNOWN":                      1,
	"INVALID_DATE":                 2,
	"START_DATE_AFTER_END_DATE":    3,
	"CANNOT_SET_DATE_TO_PAST":      4,
	"AFTER_MAXIMUM_ALLOWABLE_DATE": 5,
	"CANNOT_MODIFY_START_DATE_IF_ALREADY_STARTED": 6,
}

func (x DateRangeErrorEnum_DateRangeError) String() string {
	return proto.EnumName(DateRangeErrorEnum_DateRangeError_name, int32(x))
}

func (DateRangeErrorEnum_DateRangeError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_a97a5f455042a19e, []int{0, 0}
}

// Container for enum describing possible date range errors.
type DateRangeErrorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DateRangeErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.DateRangeErrorEnum_DateRangeError", DateRangeErrorEnum_DateRangeError_name, DateRangeErrorEnum_DateRangeError_value)
	proto.RegisterType((*DateRangeErrorEnum)(nil), "google.ads.googleads.v3.errors.DateRangeErrorEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/errors/date_range_error.proto", fileDescriptor_a97a5f455042a19e)
}

var fileDescriptor_a97a5f455042a19e = []byte{
	// 390 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xc1, 0x8e, 0x95, 0x30,
	0x14, 0x86, 0xe5, 0x8e, 0x8e, 0x49, 0xc7, 0x28, 0xa9, 0x0b, 0xa3, 0x8e, 0x13, 0xc3, 0xd6, 0xa4,
	0x2c, 0x88, 0x9b, 0xba, 0x3a, 0x77, 0x5a, 0x26, 0x44, 0x28, 0x04, 0xb8, 0x8c, 0x1a, 0x92, 0xa6,
	0x0a, 0x21, 0x37, 0x99, 0xa1, 0x37, 0x14, 0xe7, 0x81, 0x5c, 0xfa, 0x28, 0x6e, 0x7c, 0x0b, 0x17,
	0x2e, 0x7c, 0x06, 0x03, 0xe5, 0xde, 0x38, 0x0b, 0x67, 0xc5, 0xcf, 0xdf, 0xff, 0x3b, 0xa7, 0x3d,
	0x07, 0xbd, 0xed, 0xb4, 0xee, 0xae, 0x5a, 0x5f, 0x35, 0xc6, 0xb7, 0x72, 0x52, 0x37, 0x81, 0xdf,
	0x0e, 0x83, 0x1e, 0x8c, 0xdf, 0xa8, 0xb1, 0x95, 0x83, 0xea, 0xbb, 0x56, 0xce, 0x0e, 0xd9, 0x0d,
	0x7a, 0xd4, 0xf8, 0xcc, 0x66, 0x89, 0x6a, 0x0c, 0x39, 0x60, 0xe4, 0x26, 0x20, 0x16, 0x7b, 0x71,
	0xba, 0x2f, 0xbb, 0xdb, 0xfa, 0xaa, 0xef, 0xf5, 0xa8, 0xc6, 0xad, 0xee, 0x8d, 0xa5, 0xbd, 0x5f,
	0x0e, 0xc2, 0x4c, 0x8d, 0x6d, 0x3e, 0xd5, 0xe5, 0x13, 0xc1, 0xfb, 0xaf, 0xd7, 0xde, 0x4f, 0x07,
	0x3d, 0xbe, 0x6d, 0xe3, 0x27, 0xe8, 0x64, 0x23, 0x8a, 0x8c, 0x9f, 0x47, 0x61, 0xc4, 0x99, 0x7b,
	0x0f, 0x9f, 0xa0, 0x87, 0x1b, 0xf1, 0x5e, 0xa4, 0x97, 0xc2, 0x75, 0xb0, 0x8b, 0x1e, 0x45, 0xa2,
	0x82, 0x38, 0x62, 0x92, 0x41, 0xc9, 0xdd, 0x15, 0x7e, 0x85, 0x9e, 0x17, 0x25, 0xe4, 0xe5, 0xfc,
	0x2f, 0x21, 0x2c, 0x79, 0x2e, 0xb9, 0x58, 0x8e, 0x8f, 0xf0, 0x4b, 0xf4, 0xec, 0x1c, 0x84, 0x48,
	0x4b, 0x59, 0xf0, 0x25, 0x53, 0xa6, 0x32, 0x83, 0xa2, 0x74, 0xef, 0xe3, 0xd7, 0xe8, 0xd4, 0x02,
	0x09, 0x7c, 0x88, 0x92, 0x4d, 0x22, 0x21, 0x8e, 0xd3, 0x4b, 0x58, 0xc7, 0xdc, 0xe2, 0x0f, 0xb0,
	0x8f, 0xde, 0x2c, 0x78, 0x92, 0xb2, 0x28, 0xfc, 0x28, 0xff, 0xe9, 0x15, 0x85, 0x12, 0xe2, 0x9c,
	0x03, 0x5b, 0x5c, 0xce, 0xdc, 0xe3, 0xf5, 0x1f, 0x07, 0x79, 0x5f, 0xf4, 0x35, 0xb9, 0x7b, 0x5a,
	0xeb, 0xa7, 0xb7, 0x5f, 0x9d, 0x4d, 0x43, 0xca, 0x9c, 0x4f, 0x6c, 0xc1, 0x3a, 0x7d, 0xa5, 0xfa,
	0x8e, 0xe8, 0xa1, 0xf3, 0xbb, 0xb6, 0x9f, 0x47, 0xb8, 0xdf, 0xd5, 0x6e, 0x6b, 0xfe, 0xb7, 0xba,
	0x77, 0xf6, 0xf3, 0x6d, 0x75, 0x74, 0x01, 0xf0, 0x7d, 0x75, 0x76, 0x61, 0x8b, 0x41, 0x63, 0x88,
	0x95, 0x93, 0xaa, 0x02, 0x32, 0xb7, 0x34, 0x3f, 0xf6, 0x81, 0x1a, 0x1a, 0x53, 0x1f, 0x02, 0x75,
	0x15, 0xd4, 0x36, 0xf0, 0x7b, 0xe5, 0x59, 0x97, 0x52, 0x68, 0x0c, 0xa5, 0x87, 0x08, 0xa5, 0x55,
	0x40, 0xa9, 0x0d, 0x7d, 0x3e, 0x9e, 0x6f, 0x17, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x15,
	0x6e, 0x6a, 0x57, 0x02, 0x00, 0x00,
}
