@@ -150,16 +150,9 @@ impl<'de, T: Deserialize<'de>, S: AsRef<[u8]>> Iterator for Within<'de, T, S> {
150150 Ok ( ip_net) => ip_net,
151151 Err ( e) => return Some ( Err ( e) ) ,
152152 } ;
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 ) {
163156 Ok ( info) => Some ( Ok ( WithinItem { ip_net, info } ) ) ,
164157 Err ( e) => Some ( Err ( e) ) ,
165158 } ;
@@ -356,12 +349,8 @@ impl<'de, S: AsRef<[u8]>> Reader<S> {
356349 return Ok ( ( None , prefix_len) ) ;
357350 }
358351
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) {
365354 Ok ( value) => Ok ( ( Some ( value) , prefix_len) ) ,
366355 Err ( e) => Err ( e) ,
367356 }
@@ -517,6 +506,7 @@ impl<'de, S: AsRef<[u8]>> Reader<S> {
517506 Ok ( val)
518507 }
519508
509+ /// Resolves a pointer from the search tree to an offset in the data section.
520510 fn resolve_data_pointer ( & self , pointer : usize ) -> Result < usize , MaxMindDbError > {
521511 let resolved = pointer - ( self . metadata . node_count as usize ) - 16 ;
522512
@@ -529,6 +519,18 @@ impl<'de, S: AsRef<[u8]>> Reader<S> {
529519
530520 Ok ( resolved)
531521 }
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+ }
532534}
533535
534536// I haven't moved all patterns of this form to a generic function as
@@ -630,7 +632,8 @@ mod tests {
630632 let result_lookup_prefix = reader. lookup_prefix :: < geoip2:: City > ( ip) ;
631633 assert ! (
632634 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
634637 ) ;
635638 }
636639
0 commit comments