Mercurial > public > mercurial-scm > hg
diff rust/hg-cpython/src/conversion.rs @ 41693:060c030c9993
rust-cpython: moved py_set() utility to conversion module
We're still hoping to get rid of it eventually, but we're going
to need it from outside the `ancestors` module before that.
author | Georges Racinet <georges.racinet@octobus.net> |
---|---|
date | Wed, 16 Jan 2019 16:05:27 +0100 |
parents | ff333620a4cc |
children | 33fe96a5c522 |
line wrap: on
line diff
--- a/rust/hg-cpython/src/conversion.rs Sun Dec 02 16:19:22 2018 +0100 +++ b/rust/hg-cpython/src/conversion.rs Wed Jan 16 16:05:27 2019 +0100 @@ -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 @@ .map(|r| r.and_then(|o| o.extract::<Revision>(py))) .collect() } + +/// Copy and convert an `HashSet<Revision>` 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<Revision>) -> PyResult<PyObject> { + let as_vec: Vec<PyObject> = 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)) +}