diff --git a/CHANGELOG.md b/CHANGELOG.md index de8ed98..f9ed817 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixes + +- Use an iterative loop to avoid stack overflow, through recursion, when using + `FindByCommit` iterator. + ## 0.5.0 ### Highlights diff --git a/src/lib.rs b/src/lib.rs index 6200a0f..0ffa5f1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -657,15 +657,14 @@ impl Iterator for FindByCommit<'_> { type Item = Result<(JobId, Job), cob::store::Error>; fn next(&mut self) -> Option { - let job = self.jobs.next()?; - job.and_then(|(id, job)| { - if self.wanted(&job) { - Ok(Some((JobId::from(id), job))) - } else { - self.next().transpose() + loop { + let job = self.jobs.next()?; + match job { + Ok((id, job)) if self.wanted(&job) => return Some(Ok((JobId::from(id), job))), + Ok(_) => continue, + Err(err) => return Some(Err(err)), } - }) - .transpose() + } } }