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

const (
	// Enum unspecified.
	ContextErrorEnum_UNSPECIFIED ContextErrorEnum_ContextError = 0
	// The received error code is not known in this version.
	ContextErrorEnum_UNKNOWN ContextErrorEnum_ContextError = 1
	// The operation is not allowed for the given context.
	ContextErrorEnum_OPERATION_NOT_PERMITTED_FOR_CONTEXT ContextErrorEnum_ContextError = 2
	// The operation is not allowed for removed resources.
	ContextErrorEnum_OPERATION_NOT_PERMITTED_FOR_REMOVED_RESOURCE ContextErrorEnum_ContextError = 3
)

var ContextErrorEnum_ContextError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "OPERATION_NOT_PERMITTED_FOR_CONTEXT",
	3: "OPERATION_NOT_PERMITTED_FOR_REMOVED_RESOURCE",
}

var ContextErrorEnum_ContextError_value = map[string]int32{
	"UNSPECIFIED":                         0,
	"UNKNOWN":                             1,
	"OPERATION_NOT_PERMITTED_FOR_CONTEXT": 2,
	"OPERATION_NOT_PERMITTED_FOR_REMOVED_RESOURCE": 3,
}

func (x ContextErrorEnum_ContextError) String() string {
	return proto.EnumName(ContextErrorEnum_ContextError_name, int32(x))
}

func (ContextErrorEnum_ContextError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dfeff622d46c8b6d, []int{0, 0}
}

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

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

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

var xxx_messageInfo_ContextErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.ContextErrorEnum_ContextError", ContextErrorEnum_ContextError_name, ContextErrorEnum_ContextError_value)
	proto.RegisterType((*ContextErrorEnum)(nil), "google.ads.googleads.v3.errors.ContextErrorEnum")
}

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

var fileDescriptor_dfeff622d46c8b6d = []byte{
	// 336 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xf3, 0x40,
	0x14, 0x85, 0xff, 0xa4, 0xf0, 0x0b, 0x53, 0xc1, 0x98, 0xa5, 0x48, 0x17, 0x71, 0xe1, 0x46, 0x26,
	0x62, 0x76, 0xe3, 0x2a, 0x4d, 0x6e, 0x4b, 0x90, 0xce, 0x84, 0x34, 0x8d, 0x22, 0x81, 0x10, 0x9b,
	0x10, 0x0a, 0xed, 0x4c, 0xc9, 0xc4, 0xe2, 0x1b, 0xf8, 0x12, 0xae, 0x5c, 0xfa, 0x28, 0x3e, 0x8a,
	0xf8, 0x10, 0x92, 0x8c, 0x2d, 0xdd, 0xd8, 0x55, 0x4e, 0x2e, 0xdf, 0x39, 0x73, 0xcf, 0x45, 0x37,
	0x95, 0x10, 0xd5, 0xb2, 0xb4, 0xf3, 0x42, 0xda, 0x4a, 0xb6, 0x6a, 0xe3, 0xd8, 0x65, 0x5d, 0x8b,
	0x5a, 0xda, 0x73, 0xc1, 0x9b, 0xf2, 0xa5, 0xc9, 0xba, 0x5f, 0xbc, 0xae, 0x45, 0x23, 0xcc, 0x81,
	0x02, 0x71, 0x5e, 0x48, 0xbc, 0xf3, 0xe0, 0x8d, 0x83, 0x95, 0xe7, 0xec, 0x7c, 0x9b, 0xb9, 0x5e,
	0xd8, 0x39, 0xe7, 0xa2, 0xc9, 0x9b, 0x85, 0xe0, 0x52, 0xb9, 0xad, 0x37, 0x0d, 0x19, 0x9e, 0x4a,
	0x85, 0x96, 0x07, 0xfe, 0xbc, 0xb2, 0x5e, 0x35, 0x74, 0xbc, 0x3f, 0x34, 0x4f, 0x50, 0x7f, 0x46,
	0xa7, 0x21, 0x78, 0xc1, 0x28, 0x00, 0xdf, 0xf8, 0x67, 0xf6, 0xd1, 0xd1, 0x8c, 0xde, 0x51, 0x76,
	0x4f, 0x0d, 0xcd, 0xbc, 0x44, 0x17, 0x2c, 0x84, 0xc8, 0x8d, 0x03, 0x46, 0x33, 0xca, 0xe2, 0x2c,
	0x84, 0x68, 0x12, 0xc4, 0x31, 0xf8, 0xd9, 0x88, 0x45, 0x99, 0xc7, 0x68, 0x0c, 0x0f, 0xb1, 0xa1,
	0x9b, 0xd7, 0xe8, 0xea, 0x10, 0x18, 0xc1, 0x84, 0x25, 0xe0, 0x67, 0x11, 0x4c, 0xd9, 0x2c, 0xf2,
	0xc0, 0xe8, 0x0d, 0xbf, 0x35, 0x64, 0xcd, 0xc5, 0x0a, 0x1f, 0xee, 0x38, 0x3c, 0xdd, 0xdf, 0x36,
	0x6c, 0x8b, 0x85, 0xda, 0xa3, 0xff, 0x6b, 0xaa, 0xc4, 0x32, 0xe7, 0x15, 0x16, 0x75, 0x65, 0x57,
	0x25, 0xef, 0x6a, 0x6f, 0x8f, 0xbb, 0x5e, 0xc8, 0xbf, 0x6e, 0x7d, 0xab, 0x3e, 0xef, 0x7a, 0x6f,
	0xec, 0xba, 0x1f, 0xfa, 0x60, 0xac, 0xc2, 0xdc, 0x42, 0x62, 0x25, 0x5b, 0x95, 0x38, 0xb8, 0x7b,
	0x52, 0x7e, 0x6e, 0x81, 0xd4, 0x2d, 0x64, 0xba, 0x03, 0xd2, 0xc4, 0x49, 0x15, 0xf0, 0xa5, 0x5b,
	0x6a, 0x4a, 0x88, 0x5b, 0x48, 0x42, 0x76, 0x08, 0x21, 0x89, 0x43, 0x88, 0x82, 0x9e, 0xfe, 0x77,
	0xdb, 0x39, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x24, 0x40, 0x75, 0x5a, 0x08, 0x02, 0x00, 0x00,
}
