@@ -150,16 +150,9 @@ impl<'de, T: Deserialize<'de>, S: AsRef<[u8]>> Iterator for Within<'de, T, S> {
150
150
Ok ( ip_net) => ip_net,
151
151
Err ( e) => return Some ( Err ( e. into ( ) ) ) ,
152
152
} ;
153
- // TODO: should this block become a helper method on reader?
154
- let rec = match self . reader . resolve_data_pointer ( current. node ) {
155
- Ok ( rec) => rec,
156
- Err ( e) => return Some ( Err ( e) ) ,
157
- } ;
158
- let mut decoder = decoder:: Decoder :: new (
159
- & self . reader . buf . as_ref ( ) [ self . reader . pointer_base ..] ,
160
- rec,
161
- ) ;
162
- return match T :: deserialize ( & mut decoder) {
153
+
154
+ // Call the new helper method to decode data
155
+ return match self . reader . decode_data_at_pointer ( current. node ) {
163
156
Ok ( info) => Some ( Ok ( WithinItem { ip_net, info } ) ) ,
164
157
Err ( e) => Some ( Err ( e) ) ,
165
158
} ;
@@ -356,12 +349,8 @@ impl<'de, S: AsRef<[u8]>> Reader<S> {
356
349
return Ok ( ( None , prefix_len) ) ;
357
350
}
358
351
359
- // If pointer > 0, attempt to resolve and decode data
360
- let rec = self . resolve_data_pointer ( pointer) ?;
361
- let mut decoder = decoder:: Decoder :: new ( & self . buf . as_ref ( ) [ self . pointer_base ..] , rec) ;
362
-
363
- // Attempt to deserialize. If successful, wrap in Some. If error, propagate.
364
- match T :: deserialize ( & mut decoder) {
352
+ // If pointer > 0, attempt to resolve and decode data using the helper method
353
+ match self . decode_data_at_pointer ( pointer) {
365
354
Ok ( value) => Ok ( ( Some ( value) , prefix_len) ) ,
366
355
Err ( e) => Err ( e) ,
367
356
}
@@ -517,6 +506,7 @@ impl<'de, S: AsRef<[u8]>> Reader<S> {
517
506
Ok ( val)
518
507
}
519
508
509
+ /// Resolves a pointer from the search tree to an offset in the data section.
520
510
fn resolve_data_pointer ( & self , pointer : usize ) -> Result < usize , MaxMindDbError > {
521
511
let resolved = pointer - ( self . metadata . node_count as usize ) - 16 ;
522
512
@@ -529,6 +519,18 @@ impl<'de, S: AsRef<[u8]>> Reader<S> {
529
519
530
520
Ok ( resolved)
531
521
}
522
+
523
+ /// Decodes data at the given pointer offset.
524
+ /// Assumes the pointer is valid and points to the data section.
525
+ fn decode_data_at_pointer < T > ( & ' de self , pointer : usize ) -> Result < T , MaxMindDbError >
526
+ where
527
+ T : Deserialize < ' de > ,
528
+ {
529
+ let resolved_offset = self . resolve_data_pointer ( pointer) ?;
530
+ let mut decoder =
531
+ decoder:: Decoder :: new ( & self . buf . as_ref ( ) [ self . pointer_base ..] , resolved_offset) ;
532
+ T :: deserialize ( & mut decoder)
533
+ }
532
534
}
533
535
534
536
// I haven't moved all patterns of this form to a generic function as
@@ -630,7 +632,8 @@ mod tests {
630
632
let result_lookup_prefix = reader. lookup_prefix :: < geoip2:: City > ( ip) ;
631
633
assert ! (
632
634
matches!( result_lookup_prefix, Ok ( ( None , 8 ) ) ) ,
633
- "lookup_prefix should return Ok(None) for unknown IP"
635
+ "lookup_prefix should return Ok((None, 8)) for unknown IP, got {:?}" ,
636
+ result_lookup_prefix
634
637
) ;
635
638
}
636
639
0 commit comments