@@ -137,7 +137,7 @@ pub struct WithinItem<T> {
137137}
138138
139139impl < ' 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