Mercurial > public > mercurial-scm > hg-stable
diff rust/hg-cpython/src/conversion.rs @ 41240:ff333620a4cc
rust-cpython: moved generic conversion fn out of ancestors module
This will allow to use it easily from other submodules
Differential Revision: https://phab.mercurial-scm.org/D5578
author | Georges Racinet <georges.racinet@octobus.net> |
---|---|
date | Sat, 12 Jan 2019 16:57:04 +0100 |
parents | |
children | 060c030c9993 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/hg-cpython/src/conversion.rs Sat Jan 12 16:57:04 2019 +0100 @@ -0,0 +1,28 @@ +// conversion.rs +// +// Copyright 2019 Georges Racinet <georges.racinet@octobus.net> +// +// This software may be used and distributed according to the terms of the +// GNU General Public License version 2 or any later version. + +//! Bindings for the hg::ancestors module provided by the +//! `hg-core` crate. From Python, this will be seen as `rustext.ancestor` + +use cpython::{ObjectProtocol, PyObject, PyResult, Python}; +use hg::Revision; +use std::iter::FromIterator; + +/// Utility function to convert a Python iterable into various collections +/// +/// We need this in particular to feed to various methods of inner objects +/// with `impl IntoIterator<Item=Revision>` arguments, because +/// a `PyErr` can arise at each step of iteration, whereas these methods +/// expect iterables over `Revision`, not over some `Result<Revision, PyErr>` +pub fn rev_pyiter_collect<C>(py: Python, revs: &PyObject) -> PyResult<C> +where + C: FromIterator<Revision>, +{ + revs.iter(py)? + .map(|r| r.and_then(|o| o.extract::<Revision>(py))) + .collect() +}