Mercurial > public > mercurial-scm > hg-stable
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 |
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 } |