diff options
| author | Mistivia <i@mistivia.com> | 2025-11-02 15:27:18 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-11-02 15:27:18 +0800 |
| commit | e9c24f4af7ed56760f6db7941827d09f6db9020b (patch) | |
| tree | 62128c43b883ce5e3148113350978755779bb5de /teleirc/matterbridge/vendor/github.com/mattermost/mattermost-server/v5/utils | |
| parent | 58d5e7cfda4781d8a57ec52aefd02983835c301a (diff) | |
add matterbridge
Diffstat (limited to 'teleirc/matterbridge/vendor/github.com/mattermost/mattermost-server/v5/utils')
| -rw-r--r-- | teleirc/matterbridge/vendor/github.com/mattermost/mattermost-server/v5/utils/jsonutils/json.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/teleirc/matterbridge/vendor/github.com/mattermost/mattermost-server/v5/utils/jsonutils/json.go b/teleirc/matterbridge/vendor/github.com/mattermost/mattermost-server/v5/utils/jsonutils/json.go new file mode 100644 index 0000000..9d5e787 --- /dev/null +++ b/teleirc/matterbridge/vendor/github.com/mattermost/mattermost-server/v5/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), + } +} |
