Skip to content

Commit 31411a0

Browse files
committed
Relint
* updated linter configuration * fixed linting errors (esp. regarding error wrapping) Signed-off-by: Frederic BIDON <[email protected]>
1 parent 2bee274 commit 31411a0

File tree

4 files changed

+69
-53
lines changed

4 files changed

+69
-53
lines changed

.golangci.yml

+13-18
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
linters-settings:
2-
govet:
3-
check-shadowing: true
4-
golint:
5-
min-confidence: 0
62
gocyclo:
73
min-complexity: 45
8-
maligned:
9-
suggest-new: true
104
dupl:
115
threshold: 200
126
goconst:
@@ -16,7 +10,7 @@ linters-settings:
1610
linters:
1711
enable-all: true
1812
disable:
19-
- maligned
13+
- recvcheck
2014
- unparam
2115
- lll
2216
- gochecknoinits
@@ -29,17 +23,13 @@ linters:
2923
- wrapcheck
3024
- testpackage
3125
- nlreturn
32-
- gomnd
33-
- exhaustivestruct
34-
- goerr113
3526
- errorlint
3627
- nestif
3728
- godot
3829
- gofumpt
3930
- paralleltest
4031
- tparallel
4132
- thelper
42-
- ifshort
4333
- exhaustruct
4434
- varnamelen
4535
- gci
@@ -52,10 +42,15 @@ linters:
5242
- forcetypeassert
5343
- cyclop
5444
# deprecated linters
55-
- deadcode
56-
- interfacer
57-
- scopelint
58-
- varcheck
59-
- structcheck
60-
- golint
61-
- nosnakecase
45+
#- deadcode
46+
#- interfacer
47+
#- scopelint
48+
#- varcheck
49+
#- structcheck
50+
#- golint
51+
#- nosnakecase
52+
#- maligned
53+
#- goerr113
54+
#- ifshort
55+
#- gomnd
56+
#- exhaustivestruct

errors.go

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package jsonpointer
2+
3+
import (
4+
"reflect"
5+
)
6+
7+
type pointerError string
8+
9+
func (e pointerError) Error() string {
10+
return string(e)
11+
}
12+
13+
var jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem()
14+
var jsonSetableType = reflect.TypeOf(new(JSONSetable)).Elem()
15+
16+
const (
17+
// ErrPointer is an error raised by the jsonpointer package
18+
ErrPointer pointerError = "JSON pointer error"
19+
20+
// ErrInvalidStart states that a JSON pointer must start with a separator
21+
ErrInvalidStart pointerError = `JSON pointer must be empty or start with a "` + pointerSeparator
22+
23+
// ErrUnsupportedValueType indicates that a value of the wrong type is being set
24+
ErrUnsupportedValueType pointerError = "only structs, pointers, maps and slices are supported for setting values"
25+
)

pointer.go

+24-28
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,8 @@ import (
3939
const (
4040
emptyPointer = ``
4141
pointerSeparator = `/`
42-
43-
invalidStart = `JSON pointer must be empty or start with a "` + pointerSeparator
44-
notFound = `Can't find the pointer in the document`
4542
)
4643

47-
var jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem()
48-
var jsonSetableType = reflect.TypeOf(new(JSONSetable)).Elem()
49-
5044
// JSONPointable is an interface for structs to implement when they need to customize the
5145
// json pointer process
5246
type JSONPointable interface {
@@ -80,7 +74,7 @@ func (p *Pointer) parse(jsonPointerString string) error {
8074

8175
if jsonPointerString != emptyPointer {
8276
if !strings.HasPrefix(jsonPointerString, pointerSeparator) {
83-
err = errors.New(invalidStart)
77+
err = errors.Join(ErrInvalidStart, ErrPointer)
8478
} else {
8579
referenceTokens := strings.Split(jsonPointerString, pointerSeparator)
8680
p.referenceTokens = append(p.referenceTokens, referenceTokens[1:]...)
@@ -128,7 +122,7 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
128122
rValue := reflect.Indirect(reflect.ValueOf(node))
129123
kind := rValue.Kind()
130124
if isNil(node) {
131-
return nil, kind, fmt.Errorf("nil value has not field %q", decodedToken)
125+
return nil, kind, fmt.Errorf("nil value has no field %q: %w", decodedToken, ErrPointer)
132126
}
133127

134128
switch typed := node.(type) {
@@ -146,7 +140,7 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
146140
case reflect.Struct:
147141
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
148142
if !ok {
149-
return nil, kind, fmt.Errorf("object has no field %q", decodedToken)
143+
return nil, kind, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
150144
}
151145
fld := rValue.FieldByName(nm)
152146
return fld.Interface(), kind, nil
@@ -158,7 +152,7 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
158152
if mv.IsValid() {
159153
return mv.Interface(), kind, nil
160154
}
161-
return nil, kind, fmt.Errorf("object has no key %q", decodedToken)
155+
return nil, kind, fmt.Errorf("object has no key %q: %w", decodedToken, ErrPointer)
162156

163157
case reflect.Slice:
164158
tokenIndex, err := strconv.Atoi(decodedToken)
@@ -167,14 +161,14 @@ func getSingleImpl(node any, decodedToken string, nameProvider *swag.NameProvide
167161
}
168162
sLength := rValue.Len()
169163
if tokenIndex < 0 || tokenIndex >= sLength {
170-
return nil, kind, fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength-1, tokenIndex)
164+
return nil, kind, fmt.Errorf("index out of bounds array[0,%d] index '%d': %w", sLength-1, tokenIndex, ErrPointer)
171165
}
172166

173167
elem := rValue.Index(tokenIndex)
174168
return elem.Interface(), kind, nil
175169

176170
default:
177-
return nil, kind, fmt.Errorf("invalid token reference %q", decodedToken)
171+
return nil, kind, fmt.Errorf("invalid token reference %q: %w", decodedToken, ErrPointer)
178172
}
179173

180174
}
@@ -194,7 +188,7 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *swag.NameP
194188
case reflect.Struct:
195189
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
196190
if !ok {
197-
return fmt.Errorf("object has no field %q", decodedToken)
191+
return fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
198192
}
199193
fld := rValue.FieldByName(nm)
200194
if fld.IsValid() {
@@ -214,18 +208,18 @@ func setSingleImpl(node, data any, decodedToken string, nameProvider *swag.NameP
214208
}
215209
sLength := rValue.Len()
216210
if tokenIndex < 0 || tokenIndex >= sLength {
217-
return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex)
211+
return fmt.Errorf("index out of bounds array[0,%d] index '%d': %w", sLength, tokenIndex, ErrPointer)
218212
}
219213

220214
elem := rValue.Index(tokenIndex)
221215
if !elem.CanSet() {
222-
return fmt.Errorf("can't set slice index %s to %v", decodedToken, data)
216+
return fmt.Errorf("can't set slice index %s to %v: %w", decodedToken, data, ErrPointer)
223217
}
224218
elem.Set(reflect.ValueOf(data))
225219
return nil
226220

227221
default:
228-
return fmt.Errorf("invalid token reference %q", decodedToken)
222+
return fmt.Errorf("invalid token reference %q: %w", decodedToken, ErrPointer)
229223
}
230224

231225
}
@@ -244,7 +238,6 @@ func (p *Pointer) get(node any, nameProvider *swag.NameProvider) (any, reflect.K
244238
}
245239

246240
for _, token := range p.referenceTokens {
247-
248241
decodedToken := Unescape(token)
249242

250243
r, knd, err := getSingleImpl(node, decodedToken, nameProvider)
@@ -264,7 +257,10 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
264257
knd := reflect.ValueOf(node).Kind()
265258

266259
if knd != reflect.Ptr && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array {
267-
return errors.New("only structs, pointers, maps and slices are supported for setting values")
260+
return errors.Join(
261+
ErrUnsupportedValueType,
262+
ErrPointer,
263+
)
268264
}
269265

270266
if nameProvider == nil {
@@ -307,7 +303,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
307303
case reflect.Struct:
308304
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
309305
if !ok {
310-
return fmt.Errorf("object has no field %q", decodedToken)
306+
return fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer)
311307
}
312308
fld := rValue.FieldByName(nm)
313309
if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr {
@@ -321,7 +317,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
321317
mv := rValue.MapIndex(kv)
322318

323319
if !mv.IsValid() {
324-
return fmt.Errorf("object has no key %q", decodedToken)
320+
return fmt.Errorf("object has no key %q: %w", decodedToken, ErrPointer)
325321
}
326322
if mv.CanAddr() && mv.Kind() != reflect.Interface && mv.Kind() != reflect.Map && mv.Kind() != reflect.Slice && mv.Kind() != reflect.Ptr {
327323
node = mv.Addr().Interface()
@@ -336,7 +332,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
336332
}
337333
sLength := rValue.Len()
338334
if tokenIndex < 0 || tokenIndex >= sLength {
339-
return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex)
335+
return fmt.Errorf("index out of bounds array[0,%d] index '%d': %w", sLength, tokenIndex, ErrPointer)
340336
}
341337

342338
elem := rValue.Index(tokenIndex)
@@ -347,7 +343,7 @@ func (p *Pointer) set(node, data any, nameProvider *swag.NameProvider) error {
347343
node = elem.Interface()
348344

349345
default:
350-
return fmt.Errorf("invalid token reference %q", decodedToken)
346+
return fmt.Errorf("invalid token reference %q: %w", decodedToken, ErrPointer)
351347
}
352348

353349
}
@@ -404,10 +400,10 @@ func (p *Pointer) Offset(document string) (int64, error) {
404400
return 0, err
405401
}
406402
default:
407-
return 0, fmt.Errorf("invalid token %#v", tk)
403+
return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer)
408404
}
409405
default:
410-
return 0, fmt.Errorf("invalid token %#v", tk)
406+
return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer)
411407
}
412408
}
413409
return offset, nil
@@ -437,16 +433,16 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) {
437433
return offset, nil
438434
}
439435
default:
440-
return 0, fmt.Errorf("invalid token %#v", tk)
436+
return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer)
441437
}
442438
}
443-
return 0, fmt.Errorf("token reference %q not found", decodedToken)
439+
return 0, fmt.Errorf("token reference %q not found: %w", decodedToken, ErrPointer)
444440
}
445441

446442
func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) {
447443
idx, err := strconv.Atoi(decodedToken)
448444
if err != nil {
449-
return 0, fmt.Errorf("token reference %q is not a number: %v", decodedToken, err)
445+
return 0, fmt.Errorf("token reference %q is not a number: %v: %w", decodedToken, err, ErrPointer)
450446
}
451447
var i int
452448
for i = 0; i < idx && dec.More(); i++ {
@@ -470,7 +466,7 @@ func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) {
470466
}
471467

472468
if !dec.More() {
473-
return 0, fmt.Errorf("token reference %q not found", decodedToken)
469+
return 0, fmt.Errorf("token reference %q not found: %w", decodedToken, ErrPointer)
474470
}
475471
return dec.InputOffset(), nil
476472
}

pointer_test.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ func (p pointableImpl) JSONLookup(token string) (any, error) {
200200
if token == "some" {
201201
return p.a, nil
202202
}
203-
return nil, fmt.Errorf("object has no field %q", token)
203+
return nil, fmt.Errorf("object has no field %q: %w", token, ErrPointer)
204204
}
205205

206206
type pointableMap map[string]string
@@ -215,7 +215,7 @@ func (p pointableMap) JSONLookup(token string) (any, error) {
215215
return v, nil
216216
}
217217

218-
return nil, fmt.Errorf("object has no key %q", token)
218+
return nil, fmt.Errorf("object has no key %q: %w", token, ErrPointer)
219219
}
220220

221221
func TestPointableInterface(t *testing.T) {
@@ -414,7 +414,7 @@ func (s settableDoc) JSONLookup(token string) (any, error) {
414414
case "d":
415415
return &s.Int, nil
416416
default:
417-
return nil, fmt.Errorf("%s is not a known field", token)
417+
return nil, fmt.Errorf("%s is not a known field: %w", token, ErrPointer)
418418
}
419419
}
420420

@@ -458,10 +458,10 @@ func (s *settableDoc) JSONSet(token string, data any) error {
458458
s.Int.Value = int(dt)
459459
return nil
460460
default:
461-
return fmt.Errorf("invalid type %T for %s", data, token)
461+
return fmt.Errorf("invalid type %T for %s: %w", data, token, ErrPointer)
462462
}
463463
}
464-
return fmt.Errorf("%s is not a known field", token)
464+
return fmt.Errorf("%s is not a known field: %w", token, ErrPointer)
465465
}
466466

467467
type settableColl struct {
@@ -480,7 +480,7 @@ func (s settableColl) JSONLookup(token string) (any, error) {
480480
if tok, err := strconv.Atoi(token); err == nil {
481481
return &s.Items[tok], nil
482482
}
483-
return nil, fmt.Errorf("%s is not a valid index", token)
483+
return nil, fmt.Errorf("%s is not a valid index: %w", token, ErrPointer)
484484
}
485485

486486
// JSONLookup implements an interface to customize json pointer lookup
@@ -489,7 +489,7 @@ func (s *settableColl) JSONSet(token string, data any) error {
489489
_, err := SetForToken(s.Items, token, data)
490490
return err
491491
}
492-
return fmt.Errorf("%s is not a valid index", token)
492+
return fmt.Errorf("%s is not a valid index: %w", token, ErrPointer)
493493
}
494494

495495
type settableCollItem struct {

0 commit comments

Comments
 (0)