Mercurial > hg
changeset 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 | 26b0a7514f01 |
children | 168041fa6d5f |
files | rust/hg-cpython/src/ancestors.rs rust/hg-cpython/src/conversion.rs rust/hg-cpython/src/lib.rs |
diffstat | 3 files changed, 30 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/hg-cpython/src/ancestors.rs Tue Jan 15 20:24:17 2019 +0100 +++ b/rust/hg-cpython/src/ancestors.rs Sat Jan 12 16:57:04 2019 +0100 @@ -34,6 +34,7 @@ //! [`LazyAncestors`]: struct.LazyAncestors.html //! [`MissingAncestors`]: struct.MissingAncestors.html //! [`AncestorsIterator`]: struct.AncestorsIterator.html +use crate::conversion::rev_pyiter_collect; use cindex::Index; use cpython::{ ObjectProtocol, PyClone, PyDict, PyList, PyModule, PyObject, @@ -46,24 +47,8 @@ MissingAncestors as CoreMissing, }; use std::cell::RefCell; -use std::iter::FromIterator; use std::collections::HashSet; -/// 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>` -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() -} - py_class!(pub class AncestorsIterator |py| { data inner: RefCell<Box<CoreIterator<Index>>>;
--- /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() +}