Skip to content

Commit ad98a2c

Browse files
committed
address PR feedback
Signed-off-by: Joe Lanford <[email protected]>
1 parent 03bdcf5 commit ad98a2c

File tree

4 files changed

+72
-59
lines changed

4 files changed

+72
-59
lines changed

alpha/declcfg/declcfg.go

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
package declcfg
22

33
import (
4+
"bytes"
45
"encoding/json"
6+
"errors"
7+
"fmt"
8+
"strings"
9+
10+
"go4.org/bytereplacer"
511

612
"github.com/operator-framework/operator-registry/alpha/property"
713
)
@@ -94,19 +100,67 @@ func (m Meta) MarshalJSON() ([]byte, error) {
94100
}
95101

96102
func (m *Meta) UnmarshalJSON(blob []byte) error {
103+
blob = bytereplacer.New(`\u003c`, "<", `\u003e`, ">", `\u0026`, "&").Replace(blob)
104+
97105
type tmp struct {
98-
Schema string `json:"schema"`
99-
Package string `json:"package,omitempty"`
100-
Name string `json:"name,omitempty"`
101-
Properties []property.Property `json:"properties,omitempty"`
106+
Schema string `json:"schema"`
107+
Package string `json:"package,omitempty"`
108+
Name string `json:"name,omitempty"`
102109
}
103110
var t tmp
104111
if err := json.Unmarshal(blob, &t); err != nil {
105-
return err
112+
// TODO: return an error that includes the the full JSON message,
113+
// the offset of the error, and the error message. Let callers
114+
// decide how to format it.
115+
return errors.New(resolveUnmarshalErr(blob, err))
106116
}
107117
m.Schema = t.Schema
108118
m.Package = t.Package
109119
m.Name = t.Name
110120
m.Blob = blob
111121
return nil
112122
}
123+
124+
func resolveUnmarshalErr(data []byte, err error) string {
125+
var te *json.UnmarshalTypeError
126+
if errors.As(err, &te) {
127+
return formatUnmarshallErrorString(data, te.Error(), te.Offset)
128+
}
129+
var se *json.SyntaxError
130+
if errors.As(err, &se) {
131+
return formatUnmarshallErrorString(data, se.Error(), se.Offset)
132+
}
133+
return err.Error()
134+
}
135+
136+
func formatUnmarshallErrorString(data []byte, errmsg string, offset int64) string {
137+
sb := new(strings.Builder)
138+
_, _ = sb.WriteString(fmt.Sprintf("%s at offset %d (indicated by <==)\n ", errmsg, offset))
139+
// attempt to present the erroneous JSON in indented, human-readable format
140+
// errors result in presenting the original, unformatted output
141+
var pretty bytes.Buffer
142+
err := json.Indent(&pretty, data, "", " ")
143+
if err == nil {
144+
pString := pretty.String()
145+
// calc the prettified string offset which correlates to the original string offset
146+
var pOffset, origOffset int64
147+
origOffset = 0
148+
for origOffset = 0; origOffset < offset; {
149+
if pString[pOffset] != '\n' && pString[pOffset] != ' ' {
150+
origOffset++
151+
}
152+
pOffset++
153+
}
154+
_, _ = sb.WriteString(pString[:pOffset])
155+
_, _ = sb.WriteString(" <== ")
156+
_, _ = sb.WriteString(pString[pOffset:])
157+
} else {
158+
for i := int64(0); i < offset; i++ {
159+
_ = sb.WriteByte(data[i])
160+
}
161+
_, _ = sb.WriteString(" <== ")
162+
_, _ = sb.Write(data[offset:])
163+
}
164+
165+
return sb.String()
166+
}

alpha/declcfg/load.go

Lines changed: 2 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package declcfg
22

33
import (
4-
"bytes"
54
"encoding/json"
65
"errors"
76
"fmt"
87
"io"
98
"io/fs"
109
"path/filepath"
11-
"strings"
1210

1311
"github.com/joelanford/ignore"
1412
"github.com/operator-framework/api/pkg/operators"
@@ -47,19 +45,13 @@ type WalkMetasReaderFunc func(meta *Meta, err error) error
4745
func WalkMetasReader(r io.Reader, walkFn WalkMetasReaderFunc) error {
4846
dec := yaml.NewYAMLOrJSONDecoder(r, 4096)
4947
for {
50-
doc := json.RawMessage{}
51-
if err := dec.Decode(&doc); err != nil {
48+
var in Meta
49+
if err := dec.Decode(&in); err != nil {
5250
if errors.Is(err, io.EOF) {
5351
break
5452
}
5553
return walkFn(nil, err)
5654
}
57-
doc = []byte(strings.NewReplacer(`\u003c`, "<", `\u003e`, ">", `\u0026`, "&").Replace(string(doc)))
58-
59-
var in Meta
60-
if err := json.Unmarshal(doc, &in); err != nil {
61-
return walkFn(nil, fmt.Errorf("unmarshal error: %s", resolveUnmarshalErr(doc, err)))
62-
}
6355

6456
if err := walkFn(&in, nil); err != nil {
6557
return err
@@ -235,47 +227,3 @@ func LoadFile(root fs.FS, path string) (*DeclarativeConfig, error) {
235227

236228
return cfg, nil
237229
}
238-
239-
func resolveUnmarshalErr(data []byte, err error) string {
240-
var te *json.UnmarshalTypeError
241-
if errors.As(err, &te) {
242-
return formatUnmarshallErrorString(data, te.Error(), te.Offset)
243-
}
244-
var se *json.SyntaxError
245-
if errors.As(err, &se) {
246-
return formatUnmarshallErrorString(data, se.Error(), se.Offset)
247-
}
248-
return err.Error()
249-
}
250-
251-
func formatUnmarshallErrorString(data []byte, errmsg string, offset int64) string {
252-
sb := new(strings.Builder)
253-
_, _ = sb.WriteString(fmt.Sprintf("%s at offset %d (indicated by <==)\n ", errmsg, offset))
254-
// attempt to present the erroneous JSON in indented, human-readable format
255-
// errors result in presenting the original, unformatted output
256-
var pretty bytes.Buffer
257-
err := json.Indent(&pretty, data, "", " ")
258-
if err == nil {
259-
pString := pretty.String()
260-
// calc the prettified string offset which correlates to the original string offset
261-
var pOffset, origOffset int64
262-
origOffset = 0
263-
for origOffset = 0; origOffset < offset; {
264-
if pString[pOffset] != '\n' && pString[pOffset] != ' ' {
265-
origOffset++
266-
}
267-
pOffset++
268-
}
269-
_, _ = sb.WriteString(pString[:pOffset])
270-
_, _ = sb.WriteString(" <== ")
271-
_, _ = sb.WriteString(pString[pOffset:])
272-
} else {
273-
for i := int64(0); i < offset; i++ {
274-
_ = sb.WriteByte(data[i])
275-
}
276-
_, _ = sb.WriteString(" <== ")
277-
_, _ = sb.Write(data[offset:])
278-
}
279-
280-
return sb.String()
281-
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ require (
3131
github.com/spf13/cobra v1.6.0
3232
github.com/stretchr/testify v1.8.0
3333
go.etcd.io/bbolt v1.3.6
34+
go4.org v0.0.0-20230225012048-214862532bf5
3435
golang.org/x/mod v0.6.0
3536
golang.org/x/net v0.7.0
3637
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4

go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
654654
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
655655
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
656656
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
657+
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
657658
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
658659
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
659660
github.com/sclevine/spec v1.2.0 h1:1Jwdf9jSfDl9NVmt8ndHqbTZ7XCCPbh1jI3hkDBHVYA=
@@ -721,6 +722,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
721722
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
722723
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
723724
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
725+
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
724726
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
725727
github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 h1:p7OofyZ509h8DmPLh8Hn+EIIZm/xYhdZHJ9GnXHdr6U=
726728
github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
@@ -773,6 +775,8 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/
773775
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
774776
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
775777
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
778+
go4.org v0.0.0-20230225012048-214862532bf5 h1:nifaUDeh+rPaBCMPMQHZmvJf+QdpLFnuQPwx+LxVmtc=
779+
go4.org v0.0.0-20230225012048-214862532bf5/go.mod h1:F57wTi5Lrj6WLyswp5EYV1ncrEbFGHD4hhz6S1ZYeaU=
776780
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
777781
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
778782
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -785,6 +789,7 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U
785789
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
786790
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
787791
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
792+
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
788793
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
789794
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
790795
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -818,6 +823,7 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB
818823
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
819824
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
820825
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
826+
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
821827
golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I=
822828
golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
823829
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -866,6 +872,7 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b
866872
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
867873
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
868874
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
875+
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
869876
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
870877
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
871878
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -957,6 +964,8 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc
957964
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
958965
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
959966
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
967+
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
968+
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
960969
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
961970
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
962971
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -1031,6 +1040,7 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc
10311040
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
10321041
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
10331042
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
1043+
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
10341044
golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE=
10351045
golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
10361046
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

0 commit comments

Comments
 (0)