// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/reach_plan_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 errors from ReachPlanService.
type ReachPlanErrorEnum_ReachPlanError int32

const (
	// Enum unspecified.
	ReachPlanErrorEnum_UNSPECIFIED ReachPlanErrorEnum_ReachPlanError = 0
	// The received error code is not known in this version.
	ReachPlanErrorEnum_UNKNOWN ReachPlanErrorEnum_ReachPlanError = 1
)

var ReachPlanErrorEnum_ReachPlanError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
}

var ReachPlanErrorEnum_ReachPlanError_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
}

func (x ReachPlanErrorEnum_ReachPlanError) String() string {
	return proto.EnumName(ReachPlanErrorEnum_ReachPlanError_name, int32(x))
}

func (ReachPlanErrorEnum_ReachPlanError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_8373892c2e751e6f, []int{0, 0}
}

// Container for enum describing possible errors returned from
// the ReachPlanService.
type ReachPlanErrorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ReachPlanErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.ReachPlanErrorEnum_ReachPlanError", ReachPlanErrorEnum_ReachPlanError_name, ReachPlanErrorEnum_ReachPlanError_value)
	proto.RegisterType((*ReachPlanErrorEnum)(nil), "google.ads.googleads.v3.errors.ReachPlanErrorEnum")
}

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

var fileDescriptor_8373892c2e751e6f = []byte{
	// 280 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x4a, 0xc3, 0x40,
	0x18, 0x85, 0x4d, 0x04, 0x85, 0x29, 0x68, 0x89, 0x3b, 0x91, 0x2e, 0x72, 0x80, 0x99, 0xc5, 0xe0,
	0x66, 0x5c, 0xa5, 0x26, 0x96, 0x22, 0xc4, 0xa0, 0x34, 0x82, 0x04, 0xca, 0xd8, 0x84, 0x31, 0x90,
	0xce, 0x1f, 0x66, 0x62, 0x0f, 0xe4, 0xd2, 0xa3, 0x78, 0x14, 0x17, 0x9e, 0x41, 0x26, 0xbf, 0x09,
	0x74, 0x61, 0x57, 0xf3, 0x78, 0x7c, 0xef, 0xcd, 0xe3, 0x27, 0xd7, 0x0a, 0x40, 0x35, 0x15, 0x93,
	0xa5, 0x65, 0x28, 0x9d, 0xda, 0x71, 0x56, 0x19, 0x03, 0xc6, 0x32, 0x53, 0xc9, 0xcd, 0xdb, 0xba,
	0x6d, 0xa4, 0x5e, 0xf7, 0x0e, 0x6d, 0x0d, 0x74, 0x10, 0xcc, 0x90, 0xa5, 0xb2, 0xb4, 0x74, 0x8c,
	0xd1, 0x1d, 0xa7, 0x18, 0xbb, 0xbc, 0x1a, 0x6a, 0xdb, 0x9a, 0x49, 0xad, 0xa1, 0x93, 0x5d, 0x0d,
	0xda, 0x62, 0x3a, 0x8c, 0x49, 0xf0, 0xe8, 0x7a, 0xb3, 0x46, 0xea, 0xc4, 0x05, 0x12, 0xfd, 0xbe,
	0x0d, 0x29, 0x39, 0xdb, 0x77, 0x83, 0x73, 0x32, 0x59, 0xa5, 0x4f, 0x59, 0x72, 0xbb, 0xbc, 0x5b,
	0x26, 0xf1, 0xf4, 0x28, 0x98, 0x90, 0xd3, 0x55, 0x7a, 0x9f, 0x3e, 0x3c, 0xa7, 0x53, 0x6f, 0xfe,
	0xe3, 0x91, 0x70, 0x03, 0x5b, 0x7a, 0x78, 0xca, 0xfc, 0x62, 0xbf, 0x34, 0x73, 0x0b, 0x32, 0xef,
	0x25, 0xfe, 0x8b, 0x29, 0x68, 0xa4, 0x56, 0x14, 0x8c, 0x62, 0xaa, 0xd2, 0xfd, 0xbe, 0xe1, 0x10,
	0x6d, 0x6d, 0xff, 0xbb, 0xcb, 0x0d, 0x3e, 0x1f, 0xfe, 0xf1, 0x22, 0x8a, 0x3e, 0xfd, 0xd9, 0x02,
	0xcb, 0xa2, 0xd2, 0x52, 0x94, 0x4e, 0xe5, 0x9c, 0xf6, 0x5f, 0xda, 0xaf, 0x01, 0x28, 0xa2, 0xd2,
	0x16, 0x23, 0x50, 0xe4, 0xbc, 0x40, 0xe0, 0xdb, 0x0f, 0xd1, 0x15, 0x22, 0x2a, 0xad, 0x10, 0x23,
	0x22, 0x44, 0xce, 0x85, 0x40, 0xe8, 0xf5, 0xa4, 0x5f, 0xc7, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff,
	0x97, 0x50, 0x2d, 0x4b, 0xb4, 0x01, 0x00, 0x00,
}
