Skip to content

Commit 926b573

Browse files
committed
Refactor repeated code into function
1 parent a992652 commit 926b573

File tree

1 file changed

+20
-17
lines changed

1 file changed

+20
-17
lines changed

src/maxminddb/lib.rs

+20-17
Original file line numberDiff line numberDiff line change
@@ -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.into())),
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

Comments
 (0)