Skip to content

Commit 08c2e1a

Browse files
committed
Improve error message
1 parent 14f03c1 commit 08c2e1a

File tree

7 files changed

+30
-19
lines changed

7 files changed

+30
-19
lines changed

decode_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,7 +1270,7 @@ var unmarshalTests = []unmarshalTest{
12701270
in: `invalid`, // 143
12711271
ptr: new(json.Number),
12721272
err: json.NewSyntaxError(
1273-
`json: json.Number unexpected end of JSON input`,
1273+
`invalid character 'i' looking for beginning of value`,
12741274
1,
12751275
),
12761276
},
@@ -1998,8 +1998,8 @@ type wrongStringTest struct {
19981998
}
19991999

20002000
var wrongStringTests = []wrongStringTest{
2001-
{`{"result":"x"}`, `not at beginning of value`},
2002-
{`{"result":"foo"}`, `not at beginning of value`},
2001+
{`{"result":"x"}`, `invalid character 'x' looking for beginning of value`},
2002+
{`{"result":"foo"}`, `invalid character 'f' looking for beginning of value`},
20032003
{`{"result":"123"}`, `json: cannot unmarshal number into Go struct field WrongString.Message of type string`},
20042004
{`{"result":123}`, `json: cannot unmarshal number into Go struct field WrongString.Message of type string`},
20052005
{`{"result":"\""}`, `json: string unexpected end of JSON input`},
@@ -2691,10 +2691,10 @@ func TestUnmarshalErrorAfterMultipleJSON(t *testing.T) {
26912691
err error
26922692
}{{
26932693
in: `1 false null :`,
2694-
err: json.NewSyntaxError("not at beginning of value", 14),
2694+
err: json.NewSyntaxError("invalid character '\x00' looking for beginning of value", 14),
26952695
}, {
26962696
in: `1 [] [,]`,
2697-
err: json.NewSyntaxError("not at beginning of value", 6),
2697+
err: json.NewSyntaxError("invalid character ',' looking for beginning of value", 6),
26982698
}, {
26992699
in: `1 [] [true:]`,
27002700
err: json.NewSyntaxError("json: slice unexpected end of JSON input", 10),

internal/decoder/func.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (d *funcDecoder) DecodeStream(s *Stream, depth int64, p unsafe.Pointer) err
7676
}
7777
}
7878
}
79-
return errors.ErrNotAtBeginningOfValue(start)
79+
return errors.ErrInvalidBeginningOfValue(s.buf[s.cursor], s.totalOffset())
8080
}
8181

8282
func (d *funcDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
@@ -137,5 +137,5 @@ func (d *funcDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsafe.
137137
}
138138
}
139139
}
140-
return 0, errors.ErrNotAtBeginningOfValue(start)
140+
return cursor, errors.ErrInvalidBeginningOfValue(buf[cursor], cursor)
141141
}

internal/decoder/interface.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ func (d *interfaceDecoder) decodeStreamEmptyInterface(s *Stream, depth int64, p
277277
}
278278
break
279279
}
280-
return errors.ErrNotAtBeginningOfValue(s.totalOffset())
280+
return errors.ErrInvalidBeginningOfValue(c, s.totalOffset())
281281
}
282282

283283
type emptyInterface struct {
@@ -454,5 +454,5 @@ func (d *interfaceDecoder) decodeEmptyInterface(ctx *RuntimeContext, cursor, dep
454454
**(**interface{})(unsafe.Pointer(&p)) = nil
455455
return cursor, nil
456456
}
457-
return cursor, errors.ErrNotAtBeginningOfValue(cursor)
457+
return cursor, errors.ErrInvalidBeginningOfValue(buf[cursor], cursor)
458458
}

internal/decoder/number.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ func (d *numberDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsaf
5252
}
5353

5454
func (d *numberDecoder) decodeStreamByte(s *Stream) ([]byte, error) {
55+
start := s.cursor
5556
for {
5657
switch s.char() {
5758
case ' ', '\n', '\t', '\r':
@@ -76,6 +77,9 @@ func (d *numberDecoder) decodeStreamByte(s *Stream) ([]byte, error) {
7677
}
7778
}
7879
ERROR:
80+
if s.cursor == start {
81+
return nil, errors.ErrInvalidBeginningOfValue(s.char(), s.totalOffset())
82+
}
7983
return nil, errors.ErrUnexpectedEndOfJSON("json.Number", s.totalOffset())
8084
}
8185

internal/decoder/string.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ func (d *stringDecoder) decodeStreamByte(s *Stream) ([]byte, error) {
281281
}
282282
break
283283
}
284-
return nil, errors.ErrNotAtBeginningOfValue(s.totalOffset())
284+
return nil, errors.ErrInvalidBeginningOfValue(s.char(), s.totalOffset())
285285
}
286286

287287
func (d *stringDecoder) decodeByte(buf []byte, cursor int64) ([]byte, int64, error) {
@@ -356,7 +356,7 @@ func (d *stringDecoder) decodeByte(buf []byte, cursor int64) ([]byte, int64, err
356356
cursor += 4
357357
return nil, cursor, nil
358358
default:
359-
return nil, 0, errors.ErrNotAtBeginningOfValue(cursor)
359+
return nil, 0, errors.ErrInvalidBeginningOfValue(buf[cursor], cursor)
360360
}
361361
}
362362
}

internal/decoder/struct.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ func decodeKeyByBitmapUint8(d *structDecoder, buf []byte, cursor int64) (int64,
261261
cursor++
262262
}
263263
default:
264-
return cursor, nil, errors.ErrNotAtBeginningOfValue(cursor)
264+
return cursor, nil, errors.ErrInvalidBeginningOfValue(char(b, cursor), cursor)
265265
}
266266
}
267267
}
@@ -324,7 +324,7 @@ func decodeKeyByBitmapUint16(d *structDecoder, buf []byte, cursor int64) (int64,
324324
cursor++
325325
}
326326
default:
327-
return cursor, nil, errors.ErrNotAtBeginningOfValue(cursor)
327+
return cursor, nil, errors.ErrInvalidBeginningOfValue(char(b, cursor), cursor)
328328
}
329329
}
330330
}
@@ -376,7 +376,7 @@ func decodeKeyByBitmapUint8Stream(d *structDecoder, s *Stream) (*structFieldSet,
376376
_, cursor, p = s.stat()
377377
continue
378378
}
379-
return nil, "", errors.ErrNotAtBeginningOfValue(s.totalOffset())
379+
return nil, "", errors.ErrInvalidBeginningOfValue(char(p, cursor), s.totalOffset())
380380
case '"':
381381
cursor++
382382
FIRST_CHAR:
@@ -443,7 +443,7 @@ func decodeKeyByBitmapUint8Stream(d *structDecoder, s *Stream) (*structFieldSet,
443443
cursor++
444444
}
445445
default:
446-
return nil, "", errors.ErrNotAtBeginningOfValue(s.totalOffset())
446+
return nil, "", errors.ErrInvalidBeginningOfValue(char(p, cursor), s.totalOffset())
447447
}
448448
}
449449
}
@@ -463,7 +463,7 @@ func decodeKeyByBitmapUint16Stream(d *structDecoder, s *Stream) (*structFieldSet
463463
_, cursor, p = s.stat()
464464
continue
465465
}
466-
return nil, "", errors.ErrNotAtBeginningOfValue(s.totalOffset())
466+
return nil, "", errors.ErrInvalidBeginningOfValue(char(p, cursor), s.totalOffset())
467467
case '"':
468468
cursor++
469469
FIRST_CHAR:
@@ -530,7 +530,7 @@ func decodeKeyByBitmapUint16Stream(d *structDecoder, s *Stream) (*structFieldSet
530530
cursor++
531531
}
532532
default:
533-
return nil, "", errors.ErrNotAtBeginningOfValue(s.totalOffset())
533+
return nil, "", errors.ErrInvalidBeginningOfValue(char(p, cursor), s.totalOffset())
534534
}
535535
}
536536
}
@@ -653,7 +653,7 @@ func (d *structDecoder) DecodeStream(s *Stream, depth int64, p unsafe.Pointer) e
653653
return nil
654654
default:
655655
if s.char() != '{' {
656-
return errors.ErrNotAtBeginningOfValue(s.totalOffset())
656+
return errors.ErrInvalidBeginningOfValue(s.char(), s.totalOffset())
657657
}
658658
}
659659
s.cursor++
@@ -740,7 +740,7 @@ func (d *structDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsaf
740740
return cursor, nil
741741
case '{':
742742
default:
743-
return 0, errors.ErrNotAtBeginningOfValue(cursor)
743+
return 0, errors.ErrInvalidBeginningOfValue(char(b, cursor), cursor)
744744
}
745745
cursor++
746746
cursor = skipWhiteSpace(buf, cursor)

internal/errors/error.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,10 @@ func ErrInvalidCharacter(c byte, context string, cursor int64) *SyntaxError {
155155
Offset: cursor,
156156
}
157157
}
158+
159+
func ErrInvalidBeginningOfValue(c byte, cursor int64) *SyntaxError {
160+
return &SyntaxError{
161+
msg: fmt.Sprintf("invalid character '%c' looking for beginning of value", c),
162+
Offset: cursor,
163+
}
164+
}

0 commit comments

Comments
 (0)