1
1
use core:: ffi:: CStr ;
2
2
3
3
use super :: { error:: ErrorKind , BsonError } ;
4
+ use num_traits:: { FromBytes , Num } ;
4
5
5
6
pub struct Parser < ' de > {
6
7
offset : usize ,
@@ -49,6 +50,11 @@ impl<'de> Parser<'de> {
49
50
Ok ( value)
50
51
}
51
52
53
+ fn advance_bytes < const N : usize > ( & mut self ) -> Result < & ' de [ u8 ; N ] , BsonError > {
54
+ let bytes = self . advance_checked ( N ) ?;
55
+ Ok ( bytes. try_into ( ) . expect ( "should have correct length" ) )
56
+ }
57
+
52
58
pub fn read_cstr ( & mut self ) -> Result < & ' de str , BsonError > {
53
59
let raw = CStr :: from_bytes_until_nul ( self . remaining_input )
54
60
. map_err ( |_| self . error ( ErrorKind :: UnterminatedCString ) ) ?;
@@ -60,11 +66,15 @@ impl<'de> Parser<'de> {
60
66
Ok ( str)
61
67
}
62
68
69
+ fn read_number < const N : usize , T : Num + FromBytes < Bytes = [ u8 ; N ] > > (
70
+ & mut self ,
71
+ ) -> Result < T , BsonError > {
72
+ let bytes = self . advance_bytes :: < N > ( ) ?;
73
+ Ok ( T :: from_le_bytes ( & bytes) )
74
+ }
75
+
63
76
pub fn read_int32 ( & mut self ) -> Result < i32 , BsonError > {
64
- let slice = self . advance_checked ( 4 ) ?;
65
- Ok ( i32:: from_le_bytes (
66
- slice. try_into ( ) . expect ( "should have correct length" ) ,
67
- ) )
77
+ self . read_number ( )
68
78
}
69
79
70
80
fn read_length ( & mut self ) -> Result < usize , BsonError > {
@@ -75,24 +85,26 @@ impl<'de> Parser<'de> {
75
85
}
76
86
77
87
pub fn read_int64 ( & mut self ) -> Result < i64 , BsonError > {
78
- let slice = self . advance_checked ( 8 ) ?;
79
- Ok ( i64:: from_le_bytes (
80
- slice. try_into ( ) . expect ( "should have correct length" ) ,
81
- ) )
88
+ self . read_number ( )
89
+ }
90
+
91
+ pub fn read_uint64 ( & mut self ) -> Result < u64 , BsonError > {
92
+ self . read_number ( )
82
93
}
83
94
84
95
pub fn read_double ( & mut self ) -> Result < f64 , BsonError > {
85
- let slice = self . advance_checked ( 8 ) ?;
86
- Ok ( f64:: from_le_bytes (
87
- slice. try_into ( ) . expect ( "should have correct length" ) ,
88
- ) )
96
+ self . read_number ( )
89
97
}
90
98
91
99
pub fn read_bool ( & mut self ) -> Result < bool , BsonError > {
92
100
let byte = self . advance_byte ( ) ?;
93
101
Ok ( byte != 0 )
94
102
}
95
103
104
+ pub fn read_object_id ( & mut self ) -> Result < & ' de [ u8 ] , BsonError > {
105
+ self . advance_checked ( 12 )
106
+ }
107
+
96
108
/// Reads a BSON string, `string ::= int32 (byte*) unsigned_byte(0)`
97
109
pub fn read_string ( & mut self ) -> Result < & ' de str , BsonError > {
98
110
let length_including_null = self . read_length ( ) ?;
@@ -170,7 +182,7 @@ impl<'de> Parser<'de> {
170
182
Ok ( self . subreader ( parsed_size) ?. remaining ( ) )
171
183
}
172
184
173
- /// If only a single byte is left in the current scope, assert that it is a zero byte.
185
+ /// If only a single byte is left in the current scope, validate that it is a zero byte.
174
186
///
175
187
/// Otherwise returns false as we haven't reached the end of a document.
176
188
pub fn end_document ( & mut self ) -> Result < bool , BsonError > {
0 commit comments