Skip to content

Commit 56f3433

Browse files
rossoschwald
authored andcommitted
Error handling while iterating
1 parent 1251474 commit 56f3433

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

examples/within.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ fn main() -> Result<(), String> {
1919
} else {
2020
IpNetwork::V4(cidr.parse().unwrap())
2121
};
22-
for i in reader.within(ip_net).map_err(|e| e.to_string())? {
22+
for r in reader.within(ip_net).map_err(|e| e.to_string())? {
23+
let i = r.map_err(|e| e.to_string())?;
2324
let (ip_net, info): (IpNetwork, geoip2::City) = (i.ip_net, i.info);
2425
println!("ip_net={}, info={:#?}", ip_net, info);
2526
}

src/maxminddb/lib.rs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ pub struct WithinItem<T> {
137137
}
138138

139139
impl<'de, T: Deserialize<'de>, S: AsRef<[u8]>> Iterator for Within<'de, T, S> {
140-
type Item = WithinItem<T>;
140+
type Item = Result<WithinItem<T>, MaxMindDBError>;
141141

142142
fn next(&mut self) -> Option<Self::Item> {
143143
while !self.stack.is_empty() {
@@ -147,20 +147,24 @@ impl<'de, T: Deserialize<'de>, S: AsRef<[u8]>> Iterator for Within<'de, T, S> {
147147

148148
if current.node > self.node_count {
149149
// This is a data node, emit it and we're done (until the following next call)
150-
// TODO: error handling
151150
let ip_net =
152-
bytes_and_prefix_to_net(&current.ip_bytes, current.prefix_len as u8).unwrap();
151+
match bytes_and_prefix_to_net(&current.ip_bytes, current.prefix_len as u8) {
152+
Ok(ip_net) => ip_net,
153+
Err(e) => return Some(Err(e)),
154+
};
153155
//println!(" emit: current={:#?}, net={}", current, net);
154-
// TODO: error handling (should this be a method?)
155-
let rec = self.reader.resolve_data_pointer(current.node).unwrap();
156+
let rec = match self.reader.resolve_data_pointer(current.node) {
157+
Ok(rec) => rec,
158+
Err(e) => return Some(Err(e)),
159+
};
156160
let mut decoder = decoder::Decoder::new(
157161
&self.reader.buf.as_ref()[self.reader.pointer_base..],
158162
rec,
159163
);
160-
return Some(WithinItem {
164+
return Some(Ok(WithinItem {
161165
ip_net,
162166
info: T::deserialize(&mut decoder).unwrap(),
163-
});
167+
}));
164168
} else if current.node == self.node_count {
165169
// Dead end, nothing to do
166170
} else {
@@ -169,16 +173,22 @@ impl<'de, T: Deserialize<'de>, S: AsRef<[u8]>> Iterator for Within<'de, T, S> {
169173
let mut right_ip_bytes = current.ip_bytes.clone();
170174
right_ip_bytes[current.prefix_len >> 3] |=
171175
1 << ((bit_count - current.prefix_len - 1) % 8);
176+
let node = match self.reader.read_node(current.node, 1) {
177+
Ok(node) => node,
178+
Err(e) => return Some(Err(e)),
179+
};
172180
self.stack.push(WithinNode {
173-
// TODO: error handling
174-
node: self.reader.read_node(current.node, 1).unwrap(),
181+
node,
175182
ip_bytes: right_ip_bytes,
176183
prefix_len: current.prefix_len + 1,
177184
});
178185
// left/0-bit
186+
let node = match self.reader.read_node(current.node, 0) {
187+
Ok(node) => node,
188+
Err(e) => return Some(Err(e)),
189+
};
179190
self.stack.push(WithinNode {
180-
// TODO: error handling
181-
node: self.reader.read_node(current.node, 0).unwrap(),
191+
node,
182192
ip_bytes: current.ip_bytes.clone(),
183193
prefix_len: current.prefix_len + 1,
184194
});

0 commit comments

Comments
 (0)