@@ -55,6 +55,14 @@ impl<'de> Deserializer<'de> {
55
55
pub fn remainder ( & self ) -> Cow < ' _ , str > {
56
56
String :: from_utf8_lossy ( self . bytes . bytes ( ) )
57
57
}
58
+
59
+ fn fix_error_position ( & self , err : Error ) -> Error {
60
+ if err. position == ( Position { line : 0 , col : 0 } ) {
61
+ self . bytes . error ( err. code )
62
+ } else {
63
+ err
64
+ }
65
+ }
58
66
}
59
67
60
68
/// A convenience function for reading data from a reader
@@ -121,7 +129,7 @@ impl<'de> Deserializer<'de> {
121
129
self . deserialize_struct ( "" , & [ ] , visitor)
122
130
}
123
131
} else {
124
- visitor. visit_unit ( )
132
+ visitor. visit_unit ( ) . map_err ( |e| self . fix_error_position ( e ) )
125
133
}
126
134
}
127
135
}
@@ -138,21 +146,31 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
138
146
self . newtype_variant = false ;
139
147
140
148
if self . bytes . consume_ident ( "true" ) {
141
- return visitor. visit_bool ( true ) ;
149
+ return visitor
150
+ . visit_bool ( true )
151
+ . map_err ( |e| self . fix_error_position ( e) ) ;
142
152
} else if self . bytes . consume_ident ( "false" ) {
143
- return visitor. visit_bool ( false ) ;
153
+ return visitor
154
+ . visit_bool ( false )
155
+ . map_err ( |e| self . fix_error_position ( e) ) ;
144
156
} else if self . bytes . check_ident ( "Some" ) {
145
157
return self . deserialize_option ( visitor) ;
146
158
} else if self . bytes . consume_ident ( "None" ) {
147
- return visitor. visit_none ( ) ;
159
+ return visitor. visit_none ( ) . map_err ( |e| self . fix_error_position ( e ) ) ;
148
160
} else if self . bytes . consume ( "()" ) {
149
- return visitor. visit_unit ( ) ;
161
+ return visitor. visit_unit ( ) . map_err ( |e| self . fix_error_position ( e ) ) ;
150
162
} else if self . bytes . consume_ident ( "inf" ) {
151
- return visitor. visit_f64 ( std:: f64:: INFINITY ) ;
163
+ return visitor
164
+ . visit_f64 ( std:: f64:: INFINITY )
165
+ . map_err ( |e| self . fix_error_position ( e) ) ;
152
166
} else if self . bytes . consume_ident ( "-inf" ) {
153
- return visitor. visit_f64 ( std:: f64:: NEG_INFINITY ) ;
167
+ return visitor
168
+ . visit_f64 ( std:: f64:: NEG_INFINITY )
169
+ . map_err ( |e| self . fix_error_position ( e) ) ;
154
170
} else if self . bytes . consume_ident ( "NaN" ) {
155
- return visitor. visit_f64 ( std:: f64:: NAN ) ;
171
+ return visitor
172
+ . visit_f64 ( std:: f64:: NAN )
173
+ . map_err ( |e| self . fix_error_position ( e) ) ;
156
174
}
157
175
158
176
// `identifier` does not change state if it fails
@@ -187,6 +205,7 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
187
205
#[ cfg( feature = "integer128" ) ]
188
206
AnyNum :: U128 ( x) => visitor. visit_u128 ( x) ,
189
207
}
208
+ . map_err ( |e| self . fix_error_position ( e) )
190
209
}
191
210
b'.' => self . deserialize_f64 ( visitor) ,
192
211
b'"' | b'r' => self . deserialize_string ( visitor) ,
@@ -199,100 +218,128 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
199
218
where
200
219
V : Visitor < ' de > ,
201
220
{
202
- visitor. visit_bool ( self . bytes . bool ( ) ?)
221
+ visitor
222
+ . visit_bool ( self . bytes . bool ( ) ?)
223
+ . map_err ( |e| self . fix_error_position ( e) )
203
224
}
204
225
205
226
fn deserialize_i8 < V > ( self , visitor : V ) -> Result < V :: Value >
206
227
where
207
228
V : Visitor < ' de > ,
208
229
{
209
- visitor. visit_i8 ( self . bytes . signed_integer ( ) ?)
230
+ visitor
231
+ . visit_i8 ( self . bytes . signed_integer ( ) ?)
232
+ . map_err ( |e| self . fix_error_position ( e) )
210
233
}
211
234
212
235
fn deserialize_i16 < V > ( self , visitor : V ) -> Result < V :: Value >
213
236
where
214
237
V : Visitor < ' de > ,
215
238
{
216
- visitor. visit_i16 ( self . bytes . signed_integer ( ) ?)
239
+ visitor
240
+ . visit_i16 ( self . bytes . signed_integer ( ) ?)
241
+ . map_err ( |e| self . fix_error_position ( e) )
217
242
}
218
243
219
244
fn deserialize_i32 < V > ( self , visitor : V ) -> Result < V :: Value >
220
245
where
221
246
V : Visitor < ' de > ,
222
247
{
223
- visitor. visit_i32 ( self . bytes . signed_integer ( ) ?)
248
+ visitor
249
+ . visit_i32 ( self . bytes . signed_integer ( ) ?)
250
+ . map_err ( |e| self . fix_error_position ( e) )
224
251
}
225
252
226
253
fn deserialize_i64 < V > ( self , visitor : V ) -> Result < V :: Value >
227
254
where
228
255
V : Visitor < ' de > ,
229
256
{
230
- visitor. visit_i64 ( self . bytes . signed_integer ( ) ?)
257
+ visitor
258
+ . visit_i64 ( self . bytes . signed_integer ( ) ?)
259
+ . map_err ( |e| self . fix_error_position ( e) )
231
260
}
232
261
233
262
#[ cfg( feature = "integer128" ) ]
234
263
fn deserialize_i128 < V > ( self , visitor : V ) -> Result < V :: Value >
235
264
where
236
265
V : Visitor < ' de > ,
237
266
{
238
- visitor. visit_i128 ( self . bytes . signed_integer ( ) ?)
267
+ visitor
268
+ . visit_i128 ( self . bytes . signed_integer ( ) ?)
269
+ . map_err ( |e| self . fix_error_position ( e) )
239
270
}
240
271
241
272
fn deserialize_u8 < V > ( self , visitor : V ) -> Result < V :: Value >
242
273
where
243
274
V : Visitor < ' de > ,
244
275
{
245
- visitor. visit_u8 ( self . bytes . unsigned_integer ( ) ?)
276
+ visitor
277
+ . visit_u8 ( self . bytes . unsigned_integer ( ) ?)
278
+ . map_err ( |e| self . fix_error_position ( e) )
246
279
}
247
280
248
281
fn deserialize_u16 < V > ( self , visitor : V ) -> Result < V :: Value >
249
282
where
250
283
V : Visitor < ' de > ,
251
284
{
252
- visitor. visit_u16 ( self . bytes . unsigned_integer ( ) ?)
285
+ visitor
286
+ . visit_u16 ( self . bytes . unsigned_integer ( ) ?)
287
+ . map_err ( |e| self . fix_error_position ( e) )
253
288
}
254
289
255
290
fn deserialize_u32 < V > ( self , visitor : V ) -> Result < V :: Value >
256
291
where
257
292
V : Visitor < ' de > ,
258
293
{
259
- visitor. visit_u32 ( self . bytes . unsigned_integer ( ) ?)
294
+ visitor
295
+ . visit_u32 ( self . bytes . unsigned_integer ( ) ?)
296
+ . map_err ( |e| self . fix_error_position ( e) )
260
297
}
261
298
262
299
fn deserialize_u64 < V > ( self , visitor : V ) -> Result < V :: Value >
263
300
where
264
301
V : Visitor < ' de > ,
265
302
{
266
- visitor. visit_u64 ( self . bytes . unsigned_integer ( ) ?)
303
+ visitor
304
+ . visit_u64 ( self . bytes . unsigned_integer ( ) ?)
305
+ . map_err ( |e| self . fix_error_position ( e) )
267
306
}
268
307
269
308
#[ cfg( feature = "integer128" ) ]
270
309
fn deserialize_u128 < V > ( self , visitor : V ) -> Result < V :: Value >
271
310
where
272
311
V : Visitor < ' de > ,
273
312
{
274
- visitor. visit_u128 ( self . bytes . unsigned_integer ( ) ?)
313
+ visitor
314
+ . visit_u128 ( self . bytes . unsigned_integer ( ) ?)
315
+ . map_err ( |e| self . fix_error_position ( e) )
275
316
}
276
317
277
318
fn deserialize_f32 < V > ( self , visitor : V ) -> Result < V :: Value >
278
319
where
279
320
V : Visitor < ' de > ,
280
321
{
281
- visitor. visit_f32 ( self . bytes . float ( ) ?)
322
+ visitor
323
+ . visit_f32 ( self . bytes . float ( ) ?)
324
+ . map_err ( |e| self . fix_error_position ( e) )
282
325
}
283
326
284
327
fn deserialize_f64 < V > ( self , visitor : V ) -> Result < V :: Value >
285
328
where
286
329
V : Visitor < ' de > ,
287
330
{
288
- visitor. visit_f64 ( self . bytes . float ( ) ?)
331
+ visitor
332
+ . visit_f64 ( self . bytes . float ( ) ?)
333
+ . map_err ( |e| self . fix_error_position ( e) )
289
334
}
290
335
291
336
fn deserialize_char < V > ( self , visitor : V ) -> Result < V :: Value >
292
337
where
293
338
V : Visitor < ' de > ,
294
339
{
295
- visitor. visit_char ( self . bytes . char ( ) ?)
340
+ visitor
341
+ . visit_char ( self . bytes . char ( ) ?)
342
+ . map_err ( |e| self . fix_error_position ( e) )
296
343
}
297
344
298
345
fn deserialize_str < V > ( self , visitor : V ) -> Result < V :: Value >
@@ -303,6 +350,7 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
303
350
ParsedStr :: Allocated ( s) => visitor. visit_string ( s) ,
304
351
ParsedStr :: Slice ( s) => visitor. visit_borrowed_str ( s) ,
305
352
}
353
+ . map_err ( |e| self . fix_error_position ( e) )
306
354
}
307
355
308
356
fn deserialize_string < V > ( self , visitor : V ) -> Result < V :: Value >
@@ -333,7 +381,9 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
333
381
} ;
334
382
335
383
match res {
336
- Ok ( byte_buf) => visitor. visit_byte_buf ( byte_buf) ,
384
+ Ok ( byte_buf) => visitor
385
+ . visit_byte_buf ( byte_buf)
386
+ . map_err ( |e| self . fix_error_position ( e) ) ,
337
387
Err ( err) => self . bytes . err ( ErrorCode :: Base64Error ( err) ) ,
338
388
}
339
389
}
@@ -343,16 +393,20 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
343
393
V : Visitor < ' de > ,
344
394
{
345
395
if self . bytes . consume ( "None" ) {
346
- visitor. visit_none ( )
396
+ visitor. visit_none ( ) . map_err ( |e| self . fix_error_position ( e ) )
347
397
} else if self . bytes . exts . contains ( Extensions :: IMPLICIT_SOME ) {
348
- visitor. visit_some ( & mut * self )
398
+ visitor
399
+ . visit_some ( & mut * self )
400
+ . map_err ( |e| self . fix_error_position ( e) )
349
401
} else if self . bytes . consume ( "Some" ) && {
350
402
self . bytes . skip_ws ( ) ?;
351
403
self . bytes . consume ( "(" )
352
404
} {
353
405
self . bytes . skip_ws ( ) ?;
354
406
355
- let v = visitor. visit_some ( & mut * self ) ?;
407
+ let v = visitor
408
+ . visit_some ( & mut * self )
409
+ . map_err ( |e| self . fix_error_position ( e) ) ?;
356
410
357
411
self . bytes . skip_ws ( ) ?;
358
412
@@ -374,7 +428,7 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
374
428
if self . newtype_variant || self . bytes . consume ( "()" ) {
375
429
self . newtype_variant = false ;
376
430
377
- visitor. visit_unit ( )
431
+ visitor. visit_unit ( ) . map_err ( |e| self . fix_error_position ( e ) )
378
432
} else {
379
433
self . bytes . err ( ErrorCode :: ExpectedUnit )
380
434
}
@@ -387,7 +441,7 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
387
441
if self . newtype_variant || self . bytes . consume_struct_name ( name) ? {
388
442
self . newtype_variant = false ;
389
443
390
- visitor. visit_unit ( )
444
+ visitor. visit_unit ( ) . map_err ( |e| self . fix_error_position ( e ) )
391
445
} else {
392
446
self . deserialize_unit ( visitor)
393
447
}
@@ -400,7 +454,9 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
400
454
if self . bytes . exts . contains ( Extensions :: UNWRAP_NEWTYPES ) || self . newtype_variant {
401
455
self . newtype_variant = false ;
402
456
403
- return visitor. visit_newtype_struct ( & mut * self ) ;
457
+ return visitor
458
+ . visit_newtype_struct ( & mut * self )
459
+ . map_err ( |e| self . fix_error_position ( e) ) ;
404
460
}
405
461
406
462
self . bytes . consume_struct_name ( name) ?;
@@ -409,7 +465,9 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
409
465
410
466
if self . bytes . consume ( "(" ) {
411
467
self . bytes . skip_ws ( ) ?;
412
- let value = visitor. visit_newtype_struct ( & mut * self ) ?;
468
+ let value = visitor
469
+ . visit_newtype_struct ( & mut * self )
470
+ . map_err ( |e| self . fix_error_position ( e) ) ?;
413
471
self . bytes . comma ( ) ?;
414
472
415
473
if self . bytes . consume ( ")" ) {
@@ -431,7 +489,9 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
431
489
self . newtype_variant = false ;
432
490
433
491
if self . bytes . consume ( "[" ) {
434
- let value = visitor. visit_seq ( CommaSeparated :: new ( b']' , & mut self ) ) ?;
492
+ let value = visitor
493
+ . visit_seq ( CommaSeparated :: new ( b']' , & mut self ) )
494
+ . map_err ( |e| self . fix_error_position ( e) ) ?;
435
495
self . bytes . comma ( ) ?;
436
496
437
497
if self . bytes . consume ( "]" ) {
@@ -452,7 +512,9 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
452
512
let old_newtype_variant = self . newtype_variant ;
453
513
self . newtype_variant = false ;
454
514
455
- let value = visitor. visit_seq ( CommaSeparated :: new ( b')' , & mut self ) ) ?;
515
+ let value = visitor
516
+ . visit_seq ( CommaSeparated :: new ( b')' , & mut self ) )
517
+ . map_err ( |e| self . fix_error_position ( e) ) ?;
456
518
self . bytes . comma ( ) ?;
457
519
458
520
if old_newtype_variant || self . bytes . consume ( ")" ) {
@@ -488,7 +550,9 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
488
550
self . newtype_variant = false ;
489
551
490
552
if self . bytes . consume ( "{" ) {
491
- let value = visitor. visit_map ( CommaSeparated :: new ( b'}' , & mut self ) ) ?;
553
+ let value = visitor
554
+ . visit_map ( CommaSeparated :: new ( b'}' , & mut self ) )
555
+ . map_err ( |e| self . fix_error_position ( e) ) ?;
492
556
self . bytes . comma ( ) ?;
493
557
494
558
if self . bytes . consume ( "}" ) {
@@ -520,7 +584,9 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
520
584
let old_newtype_variant = self . newtype_variant ;
521
585
self . newtype_variant = false ;
522
586
523
- let value = visitor. visit_map ( CommaSeparated :: new ( b')' , & mut self ) ) ?;
587
+ let value = visitor
588
+ . visit_map ( CommaSeparated :: new ( b')' , & mut self ) )
589
+ . map_err ( |e| self . fix_error_position ( e) ) ?;
524
590
self . bytes . comma ( ) ?;
525
591
526
592
if old_newtype_variant || self . bytes . consume ( ")" ) {
@@ -546,16 +612,20 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
546
612
{
547
613
self . newtype_variant = false ;
548
614
549
- visitor. visit_enum ( Enum :: new ( self ) )
615
+ visitor
616
+ . visit_enum ( Enum :: new ( self ) )
617
+ . map_err ( |e| self . fix_error_position ( e) )
550
618
}
551
619
552
620
fn deserialize_identifier < V > ( self , visitor : V ) -> Result < V :: Value >
553
621
where
554
622
V : Visitor < ' de > ,
555
623
{
556
- visitor. visit_str (
557
- str:: from_utf8 ( self . bytes . identifier ( ) ?) . map_err ( |e| self . bytes . error ( e. into ( ) ) ) ?,
558
- )
624
+ visitor
625
+ . visit_str (
626
+ str:: from_utf8 ( self . bytes . identifier ( ) ?) . map_err ( |e| self . bytes . error ( e. into ( ) ) ) ?,
627
+ )
628
+ . map_err ( |e| self . fix_error_position ( e) )
559
629
}
560
630
561
631
fn deserialize_ignored_any < V > ( self , visitor : V ) -> Result < V :: Value >
0 commit comments