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
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 }
|
|
)
|
|
|