// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v2/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_fae773e72f6a49fe, []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_fae773e72f6a49fe, []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.v2.errors.ContextErrorEnum_ContextError", ContextErrorEnum_ContextError_name, ContextErrorEnum_ContextError_value)
	proto.RegisterType((*ContextErrorEnum)(nil), "google.ads.googleads.v2.errors.ContextErrorEnum")
}

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

var fileDescriptor_fae773e72f6a49fe = []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,
	0x12, 0x77, 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, 0x4e,
	0x25, 0x44, 0xb5, 0x2c, 0xed, 0xbc, 0x90, 0xb6, 0x92, 0xad, 0xda, 0x38, 0x76, 0x59, 0xd7, 0xa2,
	0x96, 0xf6, 0x5c, 0xf0, 0xa6, 0x7c, 0x69, 0xb2, 0xee, 0x17, 0xaf, 0x6b, 0xd1, 0x08, 0x73, 0xa0,
	0x40, 0x9c, 0x17, 0x12, 0xef, 0x3c, 0x78, 0xe3, 0x60, 0xe5, 0x39, 0x3b, 0xdf, 0x66, 0xae, 0x17,
	0x76, 0xce, 0xb9, 0x68, 0xf2, 0x66, 0x21, 0xb8, 0x54, 0x6e, 0xeb, 0x4d, 0x43, 0x86, 0xa7, 0x52,
	0xa1, 0xe5, 0x81, 0x3f, 0xaf, 0xac, 0x57, 0x0d, 0x1d, 0xef, 0x0f, 0xcd, 0x13, 0xd4, 0x9f, 0xd1,
	0x69, 0x08, 0x5e, 0x30, 0x0a, 0xc0, 0x37, 0xfe, 0x99, 0x7d, 0x74, 0x34, 0xa3, 0x77, 0x94, 0xdd,
	0x53, 0x43, 0x33, 0x2f, 0xd1, 0x05, 0x0b, 0x21, 0x72, 0xe3, 0x80, 0xd1, 0x8c, 0xb2, 0x38, 0x0b,
	0x21, 0x9a, 0x04, 0x71, 0x0c, 0x7e, 0x36, 0x62, 0x51, 0xe6, 0x31, 0x1a, 0xc3, 0x43, 0x6c, 0xe8,
	0xe6, 0x35, 0xba, 0x3a, 0x04, 0x46, 0x30, 0x61, 0x09, 0xf8, 0x59, 0x04, 0x53, 0x36, 0x8b, 0x3c,
	0x30, 0x7a, 0xc3, 0x6f, 0x0d, 0x59, 0x73, 0xb1, 0xc2, 0x87, 0x3b, 0x0e, 0x4f, 0xf7, 0xb7, 0x0d,
	0xdb, 0x62, 0xa1, 0xf6, 0xe8, 0xff, 0x9a, 0x2a, 0xb1, 0xcc, 0x79, 0x85, 0x45, 0x5d, 0xd9, 0x55,
	0xc9, 0xbb, 0xda, 0xdb, 0xe3, 0xae, 0x17, 0xf2, 0xaf, 0x5b, 0xdf, 0xaa, 0xcf, 0xbb, 0xde, 0x1b,
	0xbb, 0xee, 0x87, 0x3e, 0x18, 0xab, 0x30, 0xb7, 0x90, 0x58, 0xc9, 0x56, 0x25, 0x0e, 0xee, 0x9e,
	0x94, 0x9f, 0x5b, 0x20, 0x75, 0x0b, 0x99, 0xee, 0x80, 0x34, 0x71, 0x52, 0x05, 0x7c, 0xe9, 0x96,
	0x9a, 0x12, 0xe2, 0x16, 0x92, 0x90, 0x1d, 0x42, 0x48, 0xe2, 0x10, 0xa2, 0xa0, 0xa7, 0xff, 0xdd,
	0x76, 0x37, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x24, 0x30, 0x36, 0x3e, 0x08, 0x02, 0x00, 0x00,
}
