Skip to content

Commit 37607f7

Browse files
committed
Minor code cleanup
1 parent 1b25df8 commit 37607f7

File tree

2 files changed

+53
-46
lines changed

2 files changed

+53
-46
lines changed

examples/within.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ fn main() -> Result<(), String> {
2020
};
2121

2222
let mut n = 0;
23-
let mut iter: Within<geoip2::City, _> = reader.within(ip_net).map_err(|e| e.to_string())?;
23+
let iter: Within<geoip2::City, _> = reader.within(ip_net).map_err(|e| e.to_string())?;
2424
for next in iter {
2525
let item = next.map_err(|e| e.to_string())?;
2626
let continent = item.info.continent.and_then(|c| c.code).unwrap_or("");

src/maxminddb/lib.rs

Lines changed: 52 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#![deny(trivial_casts, trivial_numeric_casts, unused_import_braces)]
22

3+
use std::cmp::Ordering;
34
use std::collections::BTreeMap;
45
use std::fmt::{self, Display, Formatter};
56
use std::io;
@@ -114,53 +115,59 @@ impl<'de, T: Deserialize<'de>, S: AsRef<[u8]>> Iterator for Within<'de, T, S> {
114115
continue;
115116
}
116117

117-
if current.node > self.node_count {
118-
// This is a data node, emit it and we're done (until the following next call)
119-
let ip_net =
120-
match bytes_and_prefix_to_net(&current.ip_bytes, current.prefix_len as u8) {
118+
match current.node.cmp(&self.node_count) {
119+
Ordering::Greater => {
120+
// This is a data node, emit it and we're done (until the following next call)
121+
let ip_net = match bytes_and_prefix_to_net(
122+
&current.ip_bytes,
123+
current.prefix_len as u8,
124+
) {
121125
Ok(ip_net) => ip_net,
122126
Err(e) => return Some(Err(e)),
123127
};
124-
// TODO: should this block become a helper method on reader?
125-
let rec = match self.reader.resolve_data_pointer(current.node) {
126-
Ok(rec) => rec,
127-
Err(e) => return Some(Err(e)),
128-
};
129-
let mut decoder = decoder::Decoder::new(
130-
&self.reader.buf.as_ref()[self.reader.pointer_base..],
131-
rec,
132-
);
133-
return match T::deserialize(&mut decoder) {
134-
Ok(info) => Some(Ok(WithinItem { ip_net, info })),
135-
Err(e) => Some(Err(e)),
136-
};
137-
} else if current.node == self.node_count {
138-
// Dead end, nothing to do
139-
} else {
140-
// In order traversal of our children
141-
// right/1-bit
142-
let mut right_ip_bytes = current.ip_bytes.clone();
143-
right_ip_bytes[current.prefix_len >> 3] |=
144-
1 << ((bit_count - current.prefix_len - 1) % 8);
145-
let node = match self.reader.read_node(current.node, 1) {
146-
Ok(node) => node,
147-
Err(e) => return Some(Err(e)),
148-
};
149-
self.stack.push(WithinNode {
150-
node,
151-
ip_bytes: right_ip_bytes,
152-
prefix_len: current.prefix_len + 1,
153-
});
154-
// left/0-bit
155-
let node = match self.reader.read_node(current.node, 0) {
156-
Ok(node) => node,
157-
Err(e) => return Some(Err(e)),
158-
};
159-
self.stack.push(WithinNode {
160-
node,
161-
ip_bytes: current.ip_bytes.clone(),
162-
prefix_len: current.prefix_len + 1,
163-
});
128+
// TODO: should this block become a helper method on reader?
129+
let rec = match self.reader.resolve_data_pointer(current.node) {
130+
Ok(rec) => rec,
131+
Err(e) => return Some(Err(e)),
132+
};
133+
let mut decoder = decoder::Decoder::new(
134+
&self.reader.buf.as_ref()[self.reader.pointer_base..],
135+
rec,
136+
);
137+
return match T::deserialize(&mut decoder) {
138+
Ok(info) => Some(Ok(WithinItem { ip_net, info })),
139+
Err(e) => Some(Err(e)),
140+
};
141+
}
142+
Ordering::Equal => {
143+
// Dead end, nothing to do
144+
}
145+
Ordering::Less => {
146+
// In order traversal of our children
147+
// right/1-bit
148+
let mut right_ip_bytes = current.ip_bytes.clone();
149+
right_ip_bytes[current.prefix_len >> 3] |=
150+
1 << ((bit_count - current.prefix_len - 1) % 8);
151+
let node = match self.reader.read_node(current.node, 1) {
152+
Ok(node) => node,
153+
Err(e) => return Some(Err(e)),
154+
};
155+
self.stack.push(WithinNode {
156+
node,
157+
ip_bytes: right_ip_bytes,
158+
prefix_len: current.prefix_len + 1,
159+
});
160+
// left/0-bit
161+
let node = match self.reader.read_node(current.node, 0) {
162+
Ok(node) => node,
163+
Err(e) => return Some(Err(e)),
164+
};
165+
self.stack.push(WithinNode {
166+
node,
167+
ip_bytes: current.ip_bytes.clone(),
168+
prefix_len: current.prefix_len + 1,
169+
});
170+
}
164171
}
165172
}
166173
None
@@ -448,7 +455,7 @@ fn ip_to_bytes(address: IpAddr) -> Vec<u8> {
448455
}
449456
}
450457

451-
fn bytes_and_prefix_to_net(bytes: &Vec<u8>, prefix: u8) -> Result<IpNetwork, MaxMindDBError> {
458+
fn bytes_and_prefix_to_net(bytes: &[u8], prefix: u8) -> Result<IpNetwork, MaxMindDBError> {
452459
let (ip, pre) = match bytes.len() {
453460
4 => (
454461
IpAddr::V4(Ipv4Addr::new(bytes[0], bytes[1], bytes[2], bytes[3])),

0 commit comments

Comments
 (0)