Patchwork D5578: rust-cpython: moved generic conversion fn out of ancestors module

login
register
mail settings
Submitter phabricator
Date Jan. 16, 2019, 12:44 p.m.
Message ID <321402babb9a28949476e089289c1ea5@localhost.localdomain>
Download mbox | patch
Permalink /patch/37790/
State Not Applicable
Headers show

Comments

phabricator - Jan. 16, 2019, 12:44 p.m.
This revision was automatically updated to reflect the committed changes.
Closed by commit rHGff333620a4cc: rust-cpython: moved generic conversion fn out of ancestors module (authored by gracinet, committed by ).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D5578?vs=13212&id=13249

REVISION DETAIL
  https://phab.mercurial-scm.org/D5578

AFFECTED FILES
  rust/hg-cpython/src/ancestors.rs
  rust/hg-cpython/src/conversion.rs
  rust/hg-cpython/src/lib.rs

CHANGE DETAILS




To: gracinet, #hg-reviewers
Cc: durin42, kevincox, mercurial-devel

Patch

diff --git a/rust/hg-cpython/src/lib.rs b/rust/hg-cpython/src/lib.rs
--- a/rust/hg-cpython/src/lib.rs
+++ b/rust/hg-cpython/src/lib.rs
@@ -26,6 +26,7 @@ 
 
 pub mod ancestors;
 mod cindex;
+mod conversion;
 pub mod exceptions;
 
 py_module_initializer!(rustext, initrustext, PyInit_rustext, |py, m| {
diff --git a/rust/hg-cpython/src/conversion.rs b/rust/hg-cpython/src/conversion.rs
new file mode 100644
--- /dev/null
+++ b/rust/hg-cpython/src/conversion.rs
@@ -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()
+}
diff --git a/rust/hg-cpython/src/ancestors.rs b/rust/hg-cpython/src/ancestors.rs
--- a/rust/hg-cpython/src/ancestors.rs
+++ b/rust/hg-cpython/src/ancestors.rs
@@ -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>>>;