conversion.rs
57 lines
| 1.8 KiB
| application/rls-services+xml
|
RustLexer
Georges Racinet
|
r41276 | // 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` | ||||
Raphaël Gomès
|
r51872 | use cpython::{ObjectProtocol, PyErr, PyObject, PyResult, Python}; | ||
use hg::{Revision, RevlogIndex, UncheckedRevision}; | ||||
use crate::{exceptions::GraphError, PyRevision}; | ||||
Georges Racinet
|
r41276 | |||
/// 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>` | ||||
Raphaël Gomès
|
r51872 | pub fn rev_pyiter_collect<C, I>( | ||
py: Python, | ||||
revs: &PyObject, | ||||
index: &I, | ||||
) -> PyResult<C> | ||||
Georges Racinet
|
r41276 | where | ||
C: FromIterator<Revision>, | ||||
Raphaël Gomès
|
r51872 | I: RevlogIndex, | ||
Georges Racinet
|
r41276 | { | ||
Georges Racinet
|
r52114 | rev_pyiter_collect_or_else(py, revs, index, |r| { | ||
PyErr::new::<GraphError, _>(py, ("InvalidRevision", r.0)) | ||||
}) | ||||
} | ||||
/// Same as [`rev_pyiter_collect`], giving control on returned errors | ||||
pub fn rev_pyiter_collect_or_else<C, I>( | ||||
py: Python, | ||||
revs: &PyObject, | ||||
index: &I, | ||||
invalid_rev_error: impl FnOnce(PyRevision) -> PyErr + Copy, | ||||
) -> PyResult<C> | ||||
where | ||||
C: FromIterator<Revision>, | ||||
I: RevlogIndex, | ||||
{ | ||||
Georges Racinet
|
r41276 | revs.iter(py)? | ||
Raphaël Gomès
|
r51872 | .map(|r| { | ||
r.and_then(|o| match o.extract::<PyRevision>(py) { | ||||
Ok(r) => index | ||||
.check_revision(UncheckedRevision(r.0)) | ||||
Georges Racinet
|
r52114 | .ok_or_else(|| invalid_rev_error(r)), | ||
Raphaël Gomès
|
r51872 | Err(e) => Err(e), | ||
}) | ||||
}) | ||||
Georges Racinet
|
r41276 | .collect() | ||
} | ||||