You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

231 lines
9.4 KiB

//
// DISCLAIMER
//
// Copyright 2017 ArangoDB GmbH, Cologne, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Copyright holder is ArangoDB GmbH, Cologne, Germany
//
// Author Ewout Prangsma
//
package velocypack
import (
"errors"
"reflect"
)
// InvalidTypeError is returned when a Slice getter is called on a slice of a different type.
type InvalidTypeError struct {
Message string
}
// Error implements the error interface for InvalidTypeError.
func (e InvalidTypeError) Error() string {
return e.Message
}
// IsInvalidType returns true if the given error is an InvalidTypeError.
func IsInvalidType(err error) bool {
_, ok := Cause(err).(InvalidTypeError)
return ok
}
var (
// NumberOutOfRangeError indicates an out of range error.
NumberOutOfRangeError = errors.New("number out of range")
// IsNumberOutOfRange returns true if the given error is an NumberOutOfRangeError.
IsNumberOutOfRange = isCausedByFunc(NumberOutOfRangeError)
// IndexOutOfBoundsError indicates an index outside of array/object bounds.
IndexOutOfBoundsError = errors.New("index out of range")
// IsIndexOutOfBounds returns true if the given error is an IndexOutOfBoundsError.
IsIndexOutOfBounds = isCausedByFunc(IndexOutOfBoundsError)
// NeedAttributeTranslatorError indicates a lack of object key translator (smallint|uint -> string).
NeedAttributeTranslatorError = errors.New("need attribute translator")
// IsNeedAttributeTranslator returns true if the given error is an NeedAttributeTranslatorError.
IsNeedAttributeTranslator = isCausedByFunc(NeedAttributeTranslatorError)
// InternalError indicates an error that the client cannot prevent.
InternalError = errors.New("internal")
// IsInternal returns true if the given error is an InternalError.
IsInternal = isCausedByFunc(InternalError)
// BuilderNeedOpenArrayError indicates an (invalid) attempt to open an array/object when that is not allowed.
BuilderNeedOpenArrayError = errors.New("builder need open array")
// IsBuilderNeedOpenArray returns true if the given error is an BuilderNeedOpenArrayError.
IsBuilderNeedOpenArray = isCausedByFunc(BuilderNeedOpenArrayError)
// BuilderNeedOpenObjectError indicates an (invalid) attempt to open an array/object when that is not allowed.
BuilderNeedOpenObjectError = errors.New("builder need open object")
// IsBuilderNeedOpenObject returns true if the given error is an BuilderNeedOpenObjectError.
IsBuilderNeedOpenObject = isCausedByFunc(BuilderNeedOpenObjectError)
// BuilderNeedOpenCompoundError indicates an (invalid) attempt to close an array/object that is already closed.
BuilderNeedOpenCompoundError = errors.New("builder need open array or object")
// IsBuilderNeedOpenCompound returns true if the given error is an BuilderNeedOpenCompoundError.
IsBuilderNeedOpenCompound = isCausedByFunc(BuilderNeedOpenCompoundError)
DuplicateAttributeNameError = errors.New("duplicate key name")
// IsDuplicateAttributeName returns true if the given error is an DuplicateAttributeNameError.
IsDuplicateAttributeName = isCausedByFunc(DuplicateAttributeNameError)
// BuilderNotClosedError is returned when a call is made to Builder.Bytes without being closed.
BuilderNotClosedError = errors.New("builder not closed")
// IsBuilderNotClosed returns true if the given error is an BuilderNotClosedError.
IsBuilderNotClosed = isCausedByFunc(BuilderNotClosedError)
// BuilderKeyAlreadyWrittenError is returned when a call is made to Builder.Bytes without being closed.
BuilderKeyAlreadyWrittenError = errors.New("builder key already written")
// IsBuilderKeyAlreadyWritten returns true if the given error is an BuilderKeyAlreadyWrittenError.
IsBuilderKeyAlreadyWritten = isCausedByFunc(BuilderKeyAlreadyWrittenError)
// BuilderKeyMustBeStringError is returned when a key is not of type string.
BuilderKeyMustBeStringError = errors.New("builder key must be string")
// IsBuilderKeyMustBeString returns true if the given error is an BuilderKeyMustBeStringError.
IsBuilderKeyMustBeString = isCausedByFunc(BuilderKeyMustBeStringError)
// BuilderNeedSubValueError is returned when a RemoveLast is called without any value in an object/array.
BuilderNeedSubValueError = errors.New("builder need sub value")
// IsBuilderNeedSubValue returns true if the given error is an BuilderNeedSubValueError.
IsBuilderNeedSubValue = isCausedByFunc(BuilderNeedSubValueError)
// InvalidUtf8SequenceError indicates an invalid UTF8 (string) sequence.
InvalidUtf8SequenceError = errors.New("invalid utf8 sequence")
// IsInvalidUtf8Sequence returns true if the given error is an InvalidUtf8SequenceError.
IsInvalidUtf8Sequence = isCausedByFunc(InvalidUtf8SequenceError)
// NoJSONEquivalentError is returned when a Velocypack type cannot be converted to JSON.
NoJSONEquivalentError = errors.New("no JSON equivalent")
// IsNoJSONEquivalent returns true if the given error is an NoJSONEquivalentError.
IsNoJSONEquivalent = isCausedByFunc(NoJSONEquivalentError)
)
// isCausedByFunc creates an error test function.
func isCausedByFunc(cause error) func(err error) bool {
return func(err error) bool {
return Cause(err) == cause
}
}
// BuilderUnexpectedTypeError is returned when a Builder function received an invalid type.
type BuilderUnexpectedTypeError struct {
Message string
}
// Error implements the error interface for BuilderUnexpectedTypeError.
func (e BuilderUnexpectedTypeError) Error() string {
return e.Message
}
// IsBuilderUnexpectedType returns true if the given error is an BuilderUnexpectedTypeError.
func IsBuilderUnexpectedType(err error) bool {
_, ok := Cause(err).(BuilderUnexpectedTypeError)
return ok
}
// MarshalerError is returned when a custom VPack Marshaler returns an error.
type MarshalerError struct {
Type reflect.Type
Err error
}
// Error implements the error interface for MarshalerError.
func (e MarshalerError) Error() string {
return "error calling MarshalVPack for type " + e.Type.String() + ": " + e.Err.Error()
}
// IsMarshaler returns true if the given error is an MarshalerError.
func IsMarshaler(err error) bool {
_, ok := Cause(err).(MarshalerError)
return ok
}
// UnsupportedTypeError is returned when a type is marshaled that cannot be marshaled.
type UnsupportedTypeError struct {
Type reflect.Type
}
// Error implements the error interface for UnsupportedTypeError.
func (e UnsupportedTypeError) Error() string {
return "unsupported type " + e.Type.String()
}
// IsUnsupportedType returns true if the given error is an UnsupportedTypeError.
func IsUnsupportedType(err error) bool {
_, ok := Cause(err).(UnsupportedTypeError)
return ok
}
// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal.
// (The argument to Unmarshal must be a non-nil pointer.)
type InvalidUnmarshalError struct {
Type reflect.Type
}
func (e *InvalidUnmarshalError) Error() string {
if e.Type == nil {
return "json: Unmarshal(nil)"
}
if e.Type.Kind() != reflect.Ptr {
return "json: Unmarshal(non-pointer " + e.Type.String() + ")"
}
return "json: Unmarshal(nil " + e.Type.String() + ")"
}
// IsInvalidUnmarshal returns true if the given error is an InvalidUnmarshalError.
func IsInvalidUnmarshal(err error) bool {
_, ok := Cause(err).(*InvalidUnmarshalError)
return ok
}
// An UnmarshalTypeError describes a JSON value that was
// not appropriate for a value of a specific Go type.
type UnmarshalTypeError struct {
Value string // description of JSON value - "bool", "array", "number -5"
Type reflect.Type // type of Go value it could not be assigned to
Struct string // name of the struct type containing the field
Field string // name of the field holding the Go value
}
func (e *UnmarshalTypeError) Error() string {
if e.Struct != "" || e.Field != "" {
return "json: cannot unmarshal " + e.Value + " into Go struct field " + e.Struct + "." + e.Field + " of type " + e.Type.String()
}
return "json: cannot unmarshal " + e.Value + " into Go value of type " + e.Type.String()
}
// IsUnmarshalType returns true if the given error is an UnmarshalTypeError.
func IsUnmarshalType(err error) bool {
_, ok := Cause(err).(*UnmarshalTypeError)
return ok
}
// An ParseError is returned when JSON cannot be parsed correctly.
type ParseError struct {
msg string
Offset int64
}
func (e *ParseError) Error() string {
return e.msg
}
// IsParse returns true if the given error is a ParseError.
func IsParse(err error) bool {
_, ok := Cause(err).(*ParseError)
return ok
}
var (
// WithStack is called on every return of an error to add stacktrace information to the error.
// When setting this function, also set the Cause function.
// The interface of this function is compatible with functions in github.com/pkg/errors.
// WithStack(nil) must return nil.
WithStack = func(err error) error { return err }
// Cause is used to get the root cause of the given error.
// The interface of this function is compatible with functions in github.com/pkg/errors.
// Cause(nil) must return nil.
Cause = func(err error) error { return err }
)