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,11 +34,11 @@ //! [`LazyAncestors`]: struct.LazyAncestors.html //! [`MissingAncestors`]: struct.MissingAncestors.html //! [`AncestorsIterator`]: struct.AncestorsIterator.html -use crate::conversion::rev_pyiter_collect; +use crate::conversion::{py_set, rev_pyiter_collect}; use cindex::Index; use cpython::{ ObjectProtocol, PyClone, PyDict, PyList, PyModule, PyObject, PyResult, - PyTuple, Python, PythonObject, ToPyObject, + Python, PythonObject, ToPyObject, }; use exceptions::GraphError; use hg::Revision; @@ -90,24 +90,6 @@ impl AncestorsIterator { } } -/// Copy and convert an `HashSet` in a Python set -/// -/// This will probably turn useless once `PySet` support lands in -/// `rust-cpython`. -/// -/// This builds a Python tuple, then calls Python's "set()" on it -fn py_set(py: Python, set: &HashSet) -> PyResult { - let as_vec: Vec = set - .iter() - .map(|rev| rev.to_py_object(py).into_object()) - .collect(); - let as_pytuple = PyTuple::new(py, as_vec.as_slice()); - - let locals = PyDict::new(py); - locals.set_item(py, "obj", as_pytuple.to_py_object(py))?; - py.eval("set(obj)", None, Some(&locals)) -} - py_class!(pub class LazyAncestors |py| { data inner: RefCell>>; diff --git a/rust/hg-cpython/src/conversion.rs b/rust/hg-cpython/src/conversion.rs --- a/rust/hg-cpython/src/conversion.rs +++ b/rust/hg-cpython/src/conversion.rs @@ -8,8 +8,12 @@ //! 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 cpython::{ + ObjectProtocol, PyDict, PyObject, PyResult, PyTuple, Python, PythonObject, + ToPyObject, +}; use hg::Revision; +use std::collections::HashSet; use std::iter::FromIterator; /// Utility function to convert a Python iterable into various collections @@ -26,3 +30,21 @@ where .map(|r| r.and_then(|o| o.extract::(py))) .collect() } + +/// Copy and convert an `HashSet` in a Python set +/// +/// This will probably turn useless once `PySet` support lands in +/// `rust-cpython`. +/// +/// This builds a Python tuple, then calls Python's "set()" on it +pub fn py_set(py: Python, set: &HashSet) -> PyResult { + let as_vec: Vec = set + .iter() + .map(|rev| rev.to_py_object(py).into_object()) + .collect(); + let as_pytuple = PyTuple::new(py, as_vec.as_slice()); + + let locals = PyDict::new(py); + locals.set_item(py, "obj", as_pytuple.to_py_object(py))?; + py.eval("set(obj)", None, Some(&locals)) +}