annotate rust/hg-cpython/src/conversion.rs @ 42172:c3484ddbdb96 stable 5.0.1

manifest: add some documentation to _lazymanifest python code It was not particularly easy figuring out the design of this class and keeping track of how the pieces work. So might as well write some of it down for the next person.
author Matt Harbison <matt_harbison@yahoo.com>
date Thu, 23 May 2019 22:50:11 -0400
parents 060c030c9993
children 33fe96a5c522
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
41240
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
1 // conversion.rs
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
2 //
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
3 // Copyright 2019 Georges Racinet <georges.racinet@octobus.net>
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
4 //
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
5 // This software may be used and distributed according to the terms of the
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
6 // GNU General Public License version 2 or any later version.
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
7
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
8 //! Bindings for the hg::ancestors module provided by the
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
9 //! `hg-core` crate. From Python, this will be seen as `rustext.ancestor`
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
10
41704
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
11 use cpython::{
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
12 ObjectProtocol, PyDict, PyObject, PyResult, PyTuple, Python, PythonObject,
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
13 ToPyObject,
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
14 };
41240
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
15 use hg::Revision;
41704
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
16 use std::collections::HashSet;
41240
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
17 use std::iter::FromIterator;
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
18
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
19 /// Utility function to convert a Python iterable into various collections
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
20 ///
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
21 /// We need this in particular to feed to various methods of inner objects
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
22 /// with `impl IntoIterator<Item=Revision>` arguments, because
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
23 /// a `PyErr` can arise at each step of iteration, whereas these methods
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
24 /// expect iterables over `Revision`, not over some `Result<Revision, PyErr>`
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
25 pub fn rev_pyiter_collect<C>(py: Python, revs: &PyObject) -> PyResult<C>
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
26 where
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
27 C: FromIterator<Revision>,
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
28 {
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
29 revs.iter(py)?
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
30 .map(|r| r.and_then(|o| o.extract::<Revision>(py)))
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
31 .collect()
ff333620a4cc rust-cpython: moved generic conversion fn out of ancestors module
Georges Racinet <georges.racinet@octobus.net>
parents:
diff changeset
32 }
41704
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
33
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
34 /// Copy and convert an `HashSet<Revision>` in a Python set
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
35 ///
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
36 /// This will probably turn useless once `PySet` support lands in
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
37 /// `rust-cpython`.
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
38 ///
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
39 /// This builds a Python tuple, then calls Python's "set()" on it
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
40 pub fn py_set(py: Python, set: &HashSet<Revision>) -> PyResult<PyObject> {
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
41 let as_vec: Vec<PyObject> = set
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
42 .iter()
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
43 .map(|rev| rev.to_py_object(py).into_object())
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
44 .collect();
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
45 let as_pytuple = PyTuple::new(py, as_vec.as_slice());
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
46
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
47 let locals = PyDict::new(py);
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
48 locals.set_item(py, "obj", as_pytuple.to_py_object(py))?;
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
49 py.eval("set(obj)", None, Some(&locals))
060c030c9993 rust-cpython: moved py_set() utility to conversion module
Georges Racinet <georges.racinet@octobus.net>
parents: 41240
diff changeset
50 }