Skip to content

Commit 44dab56

Browse files
committed
Unmarshall error details (#1040)
* update render unmarshal failures * revamp for pretty format, error.As approach Upstream-repository: operator-registry Upstream-commit: 249ae621bb8fa6fc8a8e4a5ae26355577393f127 Signed-off-by: Jordan Keister <[email protected]>
1 parent 1c4b8e8 commit 44dab56

File tree

3 files changed

+94
-2
lines changed

3 files changed

+94
-2
lines changed

operator-registry.blacklist

+2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
0b2f43f426f9d621cab7a5224fc260ae3265be1c
22
eb2e6393796f397e93618c4aa5038f6a366cdb31
3+
6e014a3aa10f1754f7ac89ee7c0dd435f85b9d07
4+
25a478d9040b0f1fd50c5cbae570b013af01c73f

staging/operator-registry/alpha/declcfg/load.go

+46-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package declcfg
22

33
import (
4+
"bytes"
45
"encoding/json"
56
"errors"
67
"fmt"
@@ -135,7 +136,7 @@ func LoadReader(r io.Reader) (*DeclarativeConfig, error) {
135136

136137
var in Meta
137138
if err := json.Unmarshal(doc, &in); err != nil {
138-
return nil, err
139+
return nil, fmt.Errorf("unmarshal error: %s", resolveUnmarshalErr(doc, err))
139140
}
140141

141142
switch in.Schema {
@@ -186,3 +187,47 @@ func LoadFile(root fs.FS, path string) (*DeclarativeConfig, error) {
186187

187188
return cfg, nil
188189
}
190+
191+
func resolveUnmarshalErr(data []byte, err error) string {
192+
var te *json.UnmarshalTypeError
193+
if errors.As(err, &te) {
194+
return formatUnmarshallErrorString(data, te.Error(), te.Offset)
195+
}
196+
var se *json.SyntaxError
197+
if errors.As(err, &se) {
198+
return formatUnmarshallErrorString(data, se.Error(), se.Offset)
199+
}
200+
return err.Error()
201+
}
202+
203+
func formatUnmarshallErrorString(data []byte, errmsg string, offset int64) string {
204+
sb := new(strings.Builder)
205+
_, _ = sb.WriteString(fmt.Sprintf("%s at offset %d (indicated by <==)\n ", errmsg, offset))
206+
// attempt to present the erroneous JSON in indented, human-readable format
207+
// errors result in presenting the original, unformatted output
208+
var pretty bytes.Buffer
209+
err := json.Indent(&pretty, data, "", " ")
210+
if err == nil {
211+
pString := pretty.String()
212+
// calc the prettified string offset which correlates to the original string offset
213+
var pOffset, origOffset int64
214+
origOffset = 0
215+
for origOffset = 0; origOffset < offset; {
216+
pOffset++
217+
if pString[pOffset] != '\n' && pString[pOffset] != ' ' {
218+
origOffset++
219+
}
220+
}
221+
_, _ = sb.WriteString(pString[:pOffset])
222+
_, _ = sb.WriteString(" <== ")
223+
_, _ = sb.WriteString(pString[pOffset:])
224+
} else {
225+
for i := int64(0); i < offset; i++ {
226+
_ = sb.WriteByte(data[i])
227+
}
228+
_, _ = sb.WriteString(" <== ")
229+
_, _ = sb.Write(data[offset:])
230+
}
231+
232+
return sb.String()
233+
}

vendor/github.com/operator-framework/operator-registry/alpha/declcfg/load.go

+46-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)