# HG changeset patch # User Georges Racinet # Date 1698923826 -3600 # Node ID 5a7d5fd6808ca729fd8ba659b8ae138eb688e51a # Parent c817d9f626d3a88de199fd7dfbc364a5c0c1717a hg-cpython: rev_pyiter_collect_or_else It will be useful to give callers the control on the generated errors diff -r c817d9f626d3 -r 5a7d5fd6808c rust/hg-cpython/src/conversion.rs --- a/rust/hg-cpython/src/conversion.rs Mon Oct 30 11:54:42 2023 +0100 +++ b/rust/hg-cpython/src/conversion.rs Thu Nov 02 12:17:06 2023 +0100 @@ -28,17 +28,28 @@ C: FromIterator, I: RevlogIndex, { + rev_pyiter_collect_or_else(py, revs, index, |r| { + PyErr::new::(py, ("InvalidRevision", r.0)) + }) +} + +/// Same as [`rev_pyiter_collect`], giving control on returned errors +pub fn rev_pyiter_collect_or_else( + py: Python, + revs: &PyObject, + index: &I, + invalid_rev_error: impl FnOnce(PyRevision) -> PyErr + Copy, +) -> PyResult +where + C: FromIterator, + I: RevlogIndex, +{ revs.iter(py)? .map(|r| { r.and_then(|o| match o.extract::(py) { Ok(r) => index .check_revision(UncheckedRevision(r.0)) - .ok_or_else(|| { - PyErr::new::( - py, - ("InvalidRevision", r.0), - ) - }), + .ok_or_else(|| invalid_rev_error(r)), Err(e) => Err(e), }) })