diff options
Diffstat (limited to 'vendor/github.com/mattermost/mattermost-server/v6/utils/jsonutils')
-rw-r--r-- | vendor/github.com/mattermost/mattermost-server/v6/utils/jsonutils/json.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/vendor/github.com/mattermost/mattermost-server/v6/utils/jsonutils/json.go b/vendor/github.com/mattermost/mattermost-server/v6/utils/jsonutils/json.go new file mode 100644 index 00000000..9d5e7872 --- /dev/null +++ b/vendor/github.com/mattermost/mattermost-server/v6/utils/jsonutils/json.go @@ -0,0 +1,56 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +package jsonutils + +import ( + "bytes" + "encoding/json" + + "github.com/pkg/errors" +) + +type HumanizedJSONError struct { + Err error + Line int + Character int +} + +func (e *HumanizedJSONError) Error() string { + return e.Err.Error() +} + +// HumanizeJSONError extracts error offsets and annotates the error with useful context +func HumanizeJSONError(err error, data []byte) error { + if syntaxError, ok := err.(*json.SyntaxError); ok { + return NewHumanizedJSONError(syntaxError, data, syntaxError.Offset) + } else if unmarshalError, ok := err.(*json.UnmarshalTypeError); ok { + return NewHumanizedJSONError(unmarshalError, data, unmarshalError.Offset) + } else { + return err + } +} + +func NewHumanizedJSONError(err error, data []byte, offset int64) *HumanizedJSONError { + if err == nil { + return nil + } + + if offset < 0 || offset > int64(len(data)) { + return &HumanizedJSONError{ + Err: errors.Wrapf(err, "invalid offset %d", offset), + } + } + + lineSep := []byte{'\n'} + + line := bytes.Count(data[:offset], lineSep) + 1 + lastLineOffset := bytes.LastIndex(data[:offset], lineSep) + character := int(offset) - (lastLineOffset + 1) + 1 + + return &HumanizedJSONError{ + Line: line, + Character: character, + Err: errors.Wrapf(err, "parsing error at line %d, character %d", line, character), + } +} |