@@ -5,6 +5,11 @@ use alloc::vec::Vec;
5
5
use core:: ops:: Range ;
6
6
use core:: option:: Option ;
7
7
8
+ #[ cfg( not( feature = "std" ) ) ]
9
+ use alloc:: borrow:: Cow ;
10
+ #[ cfg( feature = "std" ) ]
11
+ use std:: borrow:: Cow ;
12
+
8
13
#[ cfg( all( nightly, not( feature = "std" ) ) ) ]
9
14
use core:: error:: Error ;
10
15
#[ cfg( feature = "std" ) ]
@@ -20,11 +25,11 @@ pub enum ErrorTraceDetail {
20
25
position : usize ,
21
26
} ,
22
27
TableField {
23
- field_name : & ' static str ,
28
+ field_name : Cow < ' static , str > ,
24
29
position : usize ,
25
30
} ,
26
31
UnionVariant {
27
- variant : & ' static str ,
32
+ variant : Cow < ' static , str > ,
28
33
position : usize ,
29
34
} ,
30
35
}
@@ -44,12 +49,12 @@ impl core::convert::AsRef<[ErrorTraceDetail]> for ErrorTrace {
44
49
#[ derive( Clone , Debug , PartialEq , Eq ) ]
45
50
pub enum InvalidFlatbuffer {
46
51
MissingRequiredField {
47
- required : & ' static str ,
52
+ required : Cow < ' static , str > ,
48
53
error_trace : ErrorTrace ,
49
54
} ,
50
55
InconsistentUnion {
51
- field : & ' static str ,
52
- field_type : & ' static str ,
56
+ field : Cow < ' static , str > ,
57
+ field_type : Cow < ' static , str > ,
53
58
error_trace : ErrorTrace ,
54
59
} ,
55
60
Utf8Error {
@@ -63,7 +68,7 @@ pub enum InvalidFlatbuffer {
63
68
} ,
64
69
Unaligned {
65
70
position : usize ,
66
- unaligned_type : & ' static str ,
71
+ unaligned_type : Cow < ' static , str > ,
67
72
error_trace : ErrorTrace ,
68
73
} ,
69
74
RangeOutOfBounds {
@@ -217,16 +222,19 @@ impl InvalidFlatbuffer {
217
222
error_trace : Default :: default ( ) ,
218
223
} )
219
224
}
220
- fn new_inconsistent_union < T > ( field : & ' static str , field_type : & ' static str ) -> Result < T > {
225
+ pub fn new_inconsistent_union < T > (
226
+ field : impl Into < Cow < ' static , str > > ,
227
+ field_type : impl Into < Cow < ' static , str > > ,
228
+ ) -> Result < T > {
221
229
Err ( Self :: InconsistentUnion {
222
- field,
223
- field_type,
230
+ field : field . into ( ) ,
231
+ field_type : field_type . into ( ) ,
224
232
error_trace : Default :: default ( ) ,
225
233
} )
226
234
}
227
- fn new_missing_required < T > ( required : & ' static str ) -> Result < T > {
235
+ pub fn new_missing_required < T > ( required : impl Into < Cow < ' static , str > > ) -> Result < T > {
228
236
Err ( Self :: MissingRequiredField {
229
- required,
237
+ required : required . into ( ) ,
230
238
error_trace : Default :: default ( ) ,
231
239
} )
232
240
}
@@ -251,7 +259,7 @@ fn append_trace<T>(mut res: Result<T>, d: ErrorTraceDetail) -> Result<T> {
251
259
}
252
260
253
261
/// Adds a TableField trace detail if `res` is a data error.
254
- fn trace_field < T > ( res : Result < T > , field_name : & ' static str , position : usize ) -> Result < T > {
262
+ fn trace_field < T > ( res : Result < T > , field_name : Cow < ' static , str > , position : usize ) -> Result < T > {
255
263
append_trace (
256
264
res,
257
265
ErrorTraceDetail :: TableField {
@@ -333,19 +341,19 @@ impl<'opts, 'buf> Verifier<'opts, 'buf> {
333
341
///
334
342
/// Note this does not impact soundness as this crate does not assume alignment of structs
335
343
#[ inline]
336
- fn is_aligned < T > ( & self , pos : usize ) -> Result < ( ) > {
344
+ pub fn is_aligned < T > ( & self , pos : usize ) -> Result < ( ) > {
337
345
if pos % core:: mem:: align_of :: < T > ( ) == 0 {
338
346
Ok ( ( ) )
339
347
} else {
340
348
Err ( InvalidFlatbuffer :: Unaligned {
341
- unaligned_type : core:: any:: type_name :: < T > ( ) ,
349
+ unaligned_type : Cow :: Borrowed ( core:: any:: type_name :: < T > ( ) ) ,
342
350
position : pos,
343
351
error_trace : Default :: default ( ) ,
344
352
} )
345
353
}
346
354
}
347
355
#[ inline]
348
- fn range_in_buffer ( & mut self , pos : usize , size : usize ) -> Result < ( ) > {
356
+ pub fn range_in_buffer ( & mut self , pos : usize , size : usize ) -> Result < ( ) > {
349
357
let end = pos. saturating_add ( size) ;
350
358
if end > self . buffer . len ( ) {
351
359
return InvalidFlatbuffer :: new_range_oob ( pos, end) ;
@@ -363,12 +371,17 @@ impl<'opts, 'buf> Verifier<'opts, 'buf> {
363
371
self . range_in_buffer ( pos, core:: mem:: size_of :: < T > ( ) )
364
372
}
365
373
#[ inline]
374
+ pub fn get_u8 ( & mut self , pos : usize ) -> Result < u8 > {
375
+ self . in_buffer :: < u8 > ( pos) ?;
376
+ Ok ( u8:: from_le_bytes ( [ self . buffer [ pos] ] ) )
377
+ }
378
+ #[ inline]
366
379
fn get_u16 ( & mut self , pos : usize ) -> Result < u16 > {
367
380
self . in_buffer :: < u16 > ( pos) ?;
368
381
Ok ( u16:: from_le_bytes ( [ self . buffer [ pos] , self . buffer [ pos + 1 ] ] ) )
369
382
}
370
383
#[ inline]
371
- fn get_uoffset ( & mut self , pos : usize ) -> Result < UOffsetT > {
384
+ pub fn get_uoffset ( & mut self , pos : usize ) -> Result < UOffsetT > {
372
385
self . in_buffer :: < u32 > ( pos) ?;
373
386
Ok ( u32:: from_le_bytes ( [
374
387
self . buffer [ pos] ,
@@ -434,11 +447,17 @@ impl<'opts, 'buf> Verifier<'opts, 'buf> {
434
447
/// tracing the error.
435
448
pub fn verify_union_variant < T : Verifiable > (
436
449
& mut self ,
437
- variant : & ' static str ,
450
+ variant : impl Into < Cow < ' static , str > > ,
438
451
position : usize ,
439
452
) -> Result < ( ) > {
440
453
let res = T :: run_verifier ( self , position) ;
441
- append_trace ( res, ErrorTraceDetail :: UnionVariant { variant, position } )
454
+ append_trace (
455
+ res,
456
+ ErrorTraceDetail :: UnionVariant {
457
+ variant : variant. into ( ) ,
458
+ position,
459
+ } ,
460
+ )
442
461
}
443
462
}
444
463
@@ -456,7 +475,7 @@ pub struct TableVerifier<'ver, 'opts, 'buf> {
456
475
}
457
476
458
477
impl < ' ver , ' opts , ' buf > TableVerifier < ' ver , ' opts , ' buf > {
459
- fn deref ( & mut self , field : VOffsetT ) -> Result < Option < usize > > {
478
+ pub fn deref ( & mut self , field : VOffsetT ) -> Result < Option < usize > > {
460
479
let field = field as usize ;
461
480
if field < self . vtable_len {
462
481
let field_offset = self . verifier . get_u16 ( self . vtable . saturating_add ( field) ) ?;
@@ -469,23 +488,28 @@ impl<'ver, 'opts, 'buf> TableVerifier<'ver, 'opts, 'buf> {
469
488
Ok ( None )
470
489
}
471
490
491
+ #[ inline]
492
+ pub fn verifier ( & mut self ) -> & mut Verifier < ' opts , ' buf > {
493
+ self . verifier
494
+ }
495
+
472
496
#[ inline]
473
497
pub fn visit_field < T : Verifiable > (
474
498
mut self ,
475
- field_name : & ' static str ,
499
+ field_name : impl Into < Cow < ' static , str > > ,
476
500
field : VOffsetT ,
477
501
required : bool ,
478
502
) -> Result < Self > {
479
503
if let Some ( field_pos) = self . deref ( field) ? {
480
504
trace_field (
481
505
T :: run_verifier ( self . verifier , field_pos) ,
482
- field_name,
506
+ field_name. into ( ) ,
483
507
field_pos,
484
508
) ?;
485
509
return Ok ( self ) ;
486
510
}
487
511
if required {
488
- InvalidFlatbuffer :: new_missing_required ( field_name)
512
+ InvalidFlatbuffer :: new_missing_required ( field_name. into ( ) )
489
513
} else {
490
514
Ok ( self )
491
515
}
@@ -496,9 +520,9 @@ impl<'ver, 'opts, 'buf> TableVerifier<'ver, 'opts, 'buf> {
496
520
/// reads the key, then invokes the callback to perform data-dependent verification.
497
521
pub fn visit_union < Key , UnionVerifier > (
498
522
mut self ,
499
- key_field_name : & ' static str ,
523
+ key_field_name : impl Into < Cow < ' static , str > > ,
500
524
key_field_voff : VOffsetT ,
501
- val_field_name : & ' static str ,
525
+ val_field_name : impl Into < Cow < ' static , str > > ,
502
526
val_field_voff : VOffsetT ,
503
527
required : bool ,
504
528
verify_union : UnionVerifier ,
@@ -515,24 +539,28 @@ impl<'ver, 'opts, 'buf> TableVerifier<'ver, 'opts, 'buf> {
515
539
match ( key_pos, val_pos) {
516
540
( None , None ) => {
517
541
if required {
518
- InvalidFlatbuffer :: new_missing_required ( val_field_name)
542
+ InvalidFlatbuffer :: new_missing_required ( val_field_name. into ( ) )
519
543
} else {
520
544
Ok ( self )
521
545
}
522
546
}
523
547
( Some ( k) , Some ( v) ) => {
524
- trace_field ( Key :: run_verifier ( self . verifier , k) , key_field_name, k) ?;
548
+ trace_field (
549
+ Key :: run_verifier ( self . verifier , k) ,
550
+ key_field_name. into ( ) ,
551
+ k,
552
+ ) ?;
525
553
// Safety:
526
554
// Run verifier on `k` above
527
555
let discriminant = unsafe { Key :: follow ( self . verifier . buffer , k) } ;
528
556
trace_field (
529
557
verify_union ( discriminant, self . verifier , v) ,
530
- val_field_name,
558
+ val_field_name. into ( ) ,
531
559
v,
532
560
) ?;
533
561
Ok ( self )
534
562
}
535
- _ => InvalidFlatbuffer :: new_inconsistent_union ( key_field_name, val_field_name) ,
563
+ _ => InvalidFlatbuffer :: new_inconsistent_union ( key_field_name. into ( ) , val_field_name. into ( ) ) ,
536
564
}
537
565
}
538
566
pub fn finish ( self ) -> & ' ver mut Verifier < ' opts , ' buf > {
0 commit comments