Skip to content

Commit 1c8071f

Browse files
authored
fix: Prevent filtered node iterators from panicking when exhausted (#621)
1 parent 61e9dcc commit 1c8071f

File tree

1 file changed

+36
-6
lines changed

1 file changed

+36
-6
lines changed

consumer/src/iterators.rs

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,12 @@ impl<'a, Filter: Fn(&Node) -> FilterResult> Iterator for FollowingFilteredSiblin
289289
if self.done {
290290
None
291291
} else {
292-
self.done = self.front.as_ref().unwrap().id() == self.back.as_ref().unwrap().id();
292+
self.done = self
293+
.front
294+
.as_ref()
295+
.zip(self.back.as_ref())
296+
.map(|(f, b)| f.id() == b.id())
297+
.unwrap_or(true);
293298
let current = self.front;
294299
self.front = next_filtered_sibling(self.front, &self.filter);
295300
current
@@ -304,7 +309,12 @@ impl<Filter: Fn(&Node) -> FilterResult> DoubleEndedIterator
304309
if self.done {
305310
None
306311
} else {
307-
self.done = self.back.as_ref().unwrap().id() == self.front.as_ref().unwrap().id();
312+
self.done = self
313+
.front
314+
.as_ref()
315+
.zip(self.back.as_ref())
316+
.map(|(f, b)| f.id() == b.id())
317+
.unwrap_or(true);
308318
let current = self.back;
309319
self.back = previous_filtered_sibling(self.back, &self.filter);
310320
current
@@ -347,7 +357,12 @@ impl<'a, Filter: Fn(&Node) -> FilterResult> Iterator for PrecedingFilteredSiblin
347357
if self.done {
348358
None
349359
} else {
350-
self.done = self.front.as_ref().unwrap().id() == self.back.as_ref().unwrap().id();
360+
self.done = self
361+
.front
362+
.as_ref()
363+
.zip(self.back.as_ref())
364+
.map(|(f, b)| f.id() == b.id())
365+
.unwrap_or(true);
351366
let current = self.front;
352367
self.front = previous_filtered_sibling(self.front, &self.filter);
353368
current
@@ -362,7 +377,12 @@ impl<Filter: Fn(&Node) -> FilterResult> DoubleEndedIterator
362377
if self.done {
363378
None
364379
} else {
365-
self.done = self.back.as_ref().unwrap().id() == self.front.as_ref().unwrap().id();
380+
self.done = self
381+
.front
382+
.as_ref()
383+
.zip(self.back.as_ref())
384+
.map(|(f, b)| f.id() == b.id())
385+
.unwrap_or(true);
366386
let current = self.back;
367387
self.back = next_filtered_sibling(self.back, &self.filter);
368388
current
@@ -403,7 +423,12 @@ impl<'a, Filter: Fn(&Node) -> FilterResult> Iterator for FilteredChildren<'a, Fi
403423
if self.done {
404424
None
405425
} else {
406-
self.done = self.front.as_ref().unwrap().id() == self.back.as_ref().unwrap().id();
426+
self.done = self
427+
.front
428+
.as_ref()
429+
.zip(self.back.as_ref())
430+
.map(|(f, b)| f.id() == b.id())
431+
.unwrap_or(true);
407432
let current = self.front;
408433
self.front = next_filtered_sibling(self.front, &self.filter);
409434
current
@@ -416,7 +441,12 @@ impl<Filter: Fn(&Node) -> FilterResult> DoubleEndedIterator for FilteredChildren
416441
if self.done {
417442
None
418443
} else {
419-
self.done = self.back.as_ref().unwrap().id() == self.front.as_ref().unwrap().id();
444+
self.done = self
445+
.front
446+
.as_ref()
447+
.zip(self.back.as_ref())
448+
.map(|(f, b)| f.id() == b.id())
449+
.unwrap_or(true);
420450
let current = self.back;
421451
self.back = previous_filtered_sibling(self.back, &self.filter);
422452
current

0 commit comments

Comments
 (0)