2021-03-13 07:31:14 +03:00
|
|
|
package errors
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"reflect"
|
|
|
|
"strconv"
|
|
|
|
)
|
|
|
|
|
|
|
|
type InvalidUTF8Error struct {
|
|
|
|
S string // the whole string value that caused the error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *InvalidUTF8Error) Error() string {
|
|
|
|
return fmt.Sprintf("json: invalid UTF-8 in string: %s", strconv.Quote(e.S))
|
|
|
|
}
|
|
|
|
|
|
|
|
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 fmt.Sprintf("json: Unmarshal(non-pointer %s)", e.Type)
|
|
|
|
}
|
|
|
|
return fmt.Sprintf("json: Unmarshal(nil %s)", e.Type)
|
|
|
|
}
|
|
|
|
|
|
|
|
// A MarshalerError represents an error from calling a MarshalJSON or MarshalText method.
|
|
|
|
type MarshalerError struct {
|
|
|
|
Type reflect.Type
|
|
|
|
Err error
|
|
|
|
sourceFunc string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *MarshalerError) Error() string {
|
|
|
|
srcFunc := e.sourceFunc
|
|
|
|
if srcFunc == "" {
|
|
|
|
srcFunc = "MarshalJSON"
|
|
|
|
}
|
|
|
|
return fmt.Sprintf("json: error calling %s for type %s: %s", srcFunc, e.Type, e.Err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
// Unwrap returns the underlying error.
|
|
|
|
func (e *MarshalerError) Unwrap() error { return e.Err }
|
|
|
|
|
|
|
|
// A SyntaxError is a description of a JSON syntax error.
|
|
|
|
type SyntaxError struct {
|
|
|
|
msg string // description of error
|
|
|
|
Offset int64 // error occurred after reading Offset bytes
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *SyntaxError) Error() string { return e.msg }
|
|
|
|
|
|
|
|
// An UnmarshalFieldError describes a JSON object key that
|
|
|
|
// led to an unexported (and therefore unwritable) struct field.
|
|
|
|
//
|
|
|
|
// Deprecated: No longer used; kept for compatibility.
|
|
|
|
type UnmarshalFieldError struct {
|
|
|
|
Key string
|
|
|
|
Type reflect.Type
|
|
|
|
Field reflect.StructField
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *UnmarshalFieldError) Error() string {
|
|
|
|
return fmt.Sprintf("json: cannot unmarshal object key %s into unexported field %s of type %s",
|
|
|
|
strconv.Quote(e.Key), e.Field.Name, e.Type.String(),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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
|
|
|
|
Offset int64 // error occurred after reading Offset bytes
|
|
|
|
Struct string // name of the struct type containing the field
|
|
|
|
Field string // the full path from root node to the field
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *UnmarshalTypeError) Error() string {
|
|
|
|
if e.Struct != "" || e.Field != "" {
|
|
|
|
return fmt.Sprintf("json: cannot unmarshal %s into Go struct field %s.%s of type %s",
|
|
|
|
e.Value, e.Struct, e.Field, e.Type,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
return fmt.Sprintf("json: cannot unmarshal %s into Go value of type %s", e.Value, e.Type)
|
|
|
|
}
|
|
|
|
|
|
|
|
// An UnsupportedTypeError is returned by Marshal when attempting
|
|
|
|
// to encode an unsupported value type.
|
|
|
|
type UnsupportedTypeError struct {
|
|
|
|
Type reflect.Type
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *UnsupportedTypeError) Error() string {
|
|
|
|
return fmt.Sprintf("json: unsupported type: %s", e.Type)
|
|
|
|
}
|
|
|
|
|
|
|
|
type UnsupportedValueError struct {
|
|
|
|
Value reflect.Value
|
|
|
|
Str string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *UnsupportedValueError) Error() string {
|
|
|
|
return fmt.Sprintf("json: unsupported value: %s", e.Str)
|
|
|
|
}
|
|
|
|
|
|
|
|
func ErrSyntax(msg string, offset int64) *SyntaxError {
|
|
|
|
return &SyntaxError{msg: msg, Offset: offset}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ErrMarshaler(typ reflect.Type, err error, msg string) *MarshalerError {
|
|
|
|
return &MarshalerError{
|
|
|
|
Type: typ,
|
|
|
|
Err: err,
|
|
|
|
sourceFunc: msg,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ErrExceededMaxDepth(c byte, cursor int64) *SyntaxError {
|
|
|
|
return &SyntaxError{
|
|
|
|
msg: fmt.Sprintf(`invalid character "%c" exceeded max depth`, c),
|
|
|
|
Offset: cursor,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ErrNotAtBeginningOfValue(cursor int64) *SyntaxError {
|
|
|
|
return &SyntaxError{msg: "not at beginning of value", Offset: cursor}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ErrUnexpectedEndOfJSON(msg string, cursor int64) *SyntaxError {
|
|
|
|
return &SyntaxError{
|
|
|
|
msg: fmt.Sprintf("json: %s unexpected end of JSON input", msg),
|
|
|
|
Offset: cursor,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ErrExpected(msg string, cursor int64) *SyntaxError {
|
|
|
|
return &SyntaxError{msg: fmt.Sprintf("expected %s", msg), Offset: cursor}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ErrInvalidCharacter(c byte, context string, cursor int64) *SyntaxError {
|
|
|
|
if c == 0 {
|
|
|
|
return &SyntaxError{
|
|
|
|
msg: fmt.Sprintf("json: invalid character as %s", context),
|
|
|
|
Offset: cursor,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return &SyntaxError{
|
|
|
|
msg: fmt.Sprintf("json: invalid character %c as %s", c, context),
|
|
|
|
Offset: cursor,
|
|
|
|
}
|
|
|
|
}
|
2021-08-13 11:05:07 +03:00
|
|
|
|
|
|
|
func ErrInvalidBeginningOfValue(c byte, cursor int64) *SyntaxError {
|
|
|
|
return &SyntaxError{
|
|
|
|
msg: fmt.Sprintf("invalid character '%c' looking for beginning of value", c),
|
|
|
|
Offset: cursor,
|
|
|
|
}
|
|
|
|
}
|
2022-11-28 21:55:56 +03:00
|
|
|
|
|
|
|
type PathError struct {
|
|
|
|
msg string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *PathError) Error() string {
|
|
|
|
return fmt.Sprintf("json: invalid path format: %s", e.msg)
|
|
|
|
}
|
|
|
|
|
|
|
|
func ErrInvalidPath(msg string, args ...interface{}) *PathError {
|
|
|
|
if len(args) != 0 {
|
|
|
|
return &PathError{msg: fmt.Sprintf(msg, args...)}
|
|
|
|
}
|
|
|
|
return &PathError{msg: msg}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ErrEmptyPath() *PathError {
|
|
|
|
return &PathError{msg: "path is empty"}
|
|
|
|
}
|