// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/ad_customizer_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 ad customizer errors.
type AdCustomizerErrorEnum_AdCustomizerError int32

const (
	// Enum unspecified.
	AdCustomizerErrorEnum_UNSPECIFIED AdCustomizerErrorEnum_AdCustomizerError = 0
	// The received error code is not known in this version.
	AdCustomizerErrorEnum_UNKNOWN AdCustomizerErrorEnum_AdCustomizerError = 1
	// Invalid date argument in countdown function.
	AdCustomizerErrorEnum_COUNTDOWN_INVALID_DATE_FORMAT AdCustomizerErrorEnum_AdCustomizerError = 2
	// Countdown end date is in the past.
	AdCustomizerErrorEnum_COUNTDOWN_DATE_IN_PAST AdCustomizerErrorEnum_AdCustomizerError = 3
	// Invalid locale string in countdown function.
	AdCustomizerErrorEnum_COUNTDOWN_INVALID_LOCALE AdCustomizerErrorEnum_AdCustomizerError = 4
	// Days-before argument to countdown function is not positive.
	AdCustomizerErrorEnum_COUNTDOWN_INVALID_START_DAYS_BEFORE AdCustomizerErrorEnum_AdCustomizerError = 5
	// A user list referenced in an IF function does not exist.
	AdCustomizerErrorEnum_UNKNOWN_USER_LIST AdCustomizerErrorEnum_AdCustomizerError = 6
)

var AdCustomizerErrorEnum_AdCustomizerError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "COUNTDOWN_INVALID_DATE_FORMAT",
	3: "COUNTDOWN_DATE_IN_PAST",
	4: "COUNTDOWN_INVALID_LOCALE",
	5: "COUNTDOWN_INVALID_START_DAYS_BEFORE",
	6: "UNKNOWN_USER_LIST",
}

var AdCustomizerErrorEnum_AdCustomizerError_value = map[string]int32{
	"UNSPECIFIED":                         0,
	"UNKNOWN":                             1,
	"COUNTDOWN_INVALID_DATE_FORMAT":       2,
	"COUNTDOWN_DATE_IN_PAST":              3,
	"COUNTDOWN_INVALID_LOCALE":            4,
	"COUNTDOWN_INVALID_START_DAYS_BEFORE": 5,
	"UNKNOWN_USER_LIST":                   6,
}

func (x AdCustomizerErrorEnum_AdCustomizerError) String() string {
	return proto.EnumName(AdCustomizerErrorEnum_AdCustomizerError_name, int32(x))
}

func (AdCustomizerErrorEnum_AdCustomizerError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_83f4cb4ac17f0827, []int{0, 0}
}

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

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

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

var xxx_messageInfo_AdCustomizerErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.AdCustomizerErrorEnum_AdCustomizerError", AdCustomizerErrorEnum_AdCustomizerError_name, AdCustomizerErrorEnum_AdCustomizerError_value)
	proto.RegisterType((*AdCustomizerErrorEnum)(nil), "google.ads.googleads.v3.errors.AdCustomizerErrorEnum")
}

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

var fileDescriptor_83f4cb4ac17f0827 = []byte{
	// 386 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xcf, 0x8e, 0x94, 0x40,
	0x10, 0xc6, 0x85, 0xd5, 0x35, 0xe9, 0x3d, 0xc8, 0x76, 0xb2, 0x1b, 0xb3, 0x59, 0x37, 0x11, 0x0f,
	0xde, 0x9a, 0x03, 0x17, 0xd3, 0x9e, 0x7a, 0xa0, 0x67, 0x42, 0xc4, 0x86, 0xf0, 0x6f, 0xa2, 0x21,
	0xe9, 0xe0, 0x40, 0x08, 0xc9, 0x0c, 0x3d, 0xa1, 0x99, 0x39, 0xf8, 0x38, 0x1e, 0x7d, 0x14, 0x0f,
	0x3e, 0x87, 0xf1, 0xe6, 0x1b, 0x18, 0xe8, 0x19, 0x3c, 0x10, 0xf7, 0xc4, 0x97, 0xaa, 0xdf, 0x57,
	0x54, 0x7f, 0x05, 0xde, 0xd5, 0x42, 0xd4, 0xdb, 0xca, 0x2a, 0x4a, 0x69, 0x29, 0x39, 0xa8, 0xa3,
	0x6d, 0x55, 0x5d, 0x27, 0x3a, 0x69, 0x15, 0x25, 0xdf, 0x1c, 0x64, 0x2f, 0x76, 0xcd, 0xd7, 0xaa,
	0xe3, 0x63, 0x11, 0xed, 0x3b, 0xd1, 0x0b, 0xf8, 0xa0, 0x70, 0x54, 0x94, 0x12, 0x4d, 0x4e, 0x74,
	0xb4, 0x91, 0x72, 0xde, 0xdd, 0x9f, 0x27, 0xef, 0x1b, 0xab, 0x68, 0x5b, 0xd1, 0x17, 0x7d, 0x23,
	0x5a, 0xa9, 0xdc, 0xe6, 0x2f, 0x0d, 0xdc, 0x90, 0xd2, 0x99, 0x46, 0xd3, 0xc1, 0x44, 0xdb, 0xc3,
	0xce, 0xfc, 0xa9, 0x81, 0xeb, 0x59, 0x07, 0xbe, 0x00, 0x57, 0x29, 0x8b, 0x43, 0xea, 0x78, 0x4b,
	0x8f, 0xba, 0xc6, 0x13, 0x78, 0x05, 0x9e, 0xa7, 0xec, 0x03, 0x0b, 0xd6, 0xcc, 0xd0, 0xe0, 0x6b,
	0xf0, 0xca, 0x09, 0x52, 0x96, 0xb8, 0xc1, 0x9a, 0x71, 0x8f, 0x65, 0xc4, 0xf7, 0x5c, 0xee, 0x92,
	0x84, 0xf2, 0x65, 0x10, 0x7d, 0x24, 0x89, 0xa1, 0xc3, 0x3b, 0x70, 0xfb, 0x0f, 0x19, 0x5b, 0x1e,
	0xe3, 0x21, 0x89, 0x13, 0xe3, 0x02, 0xde, 0x83, 0x97, 0x73, 0xbb, 0x1f, 0x38, 0xc4, 0xa7, 0xc6,
	0x53, 0xf8, 0x16, 0xbc, 0x99, 0x77, 0xe3, 0x84, 0x44, 0x09, 0x77, 0xc9, 0xa7, 0x98, 0x2f, 0xe8,
	0x32, 0x88, 0xa8, 0xf1, 0x0c, 0xde, 0x80, 0xeb, 0xd3, 0x4a, 0x3c, 0x8d, 0x69, 0xc4, 0x7d, 0x2f,
	0x4e, 0x8c, 0xcb, 0xc5, 0x1f, 0x0d, 0x98, 0x1b, 0xb1, 0x43, 0x8f, 0xe7, 0xb5, 0xb8, 0x9d, 0x3d,
	0x3a, 0x1c, 0x92, 0x0a, 0xb5, 0xcf, 0xee, 0xc9, 0x59, 0x8b, 0x6d, 0xd1, 0xd6, 0x48, 0x74, 0xb5,
	0x55, 0x57, 0xed, 0x98, 0xe3, 0xf9, 0x66, 0xfb, 0x46, 0xfe, 0xef, 0x84, 0xef, 0xd5, 0xe7, 0x9b,
	0x7e, 0xb1, 0x22, 0xe4, 0xbb, 0xfe, 0xb0, 0x52, 0xc3, 0x48, 0x29, 0x91, 0x92, 0x83, 0xca, 0x6c,
	0x34, 0xfe, 0x52, 0xfe, 0x38, 0x03, 0x39, 0x29, 0x65, 0x3e, 0x01, 0x79, 0x66, 0xe7, 0x0a, 0xf8,
	0xad, 0x9b, 0xaa, 0x8a, 0x31, 0x29, 0x25, 0xc6, 0x13, 0x82, 0x71, 0x66, 0x63, 0xac, 0xa0, 0x2f,
	0x97, 0xe3, 0x76, 0xf6, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xe2, 0x63, 0xa5, 0x5f, 0x02,
	0x00, 0x00,
}
