Mercurial > public > mercurial-scm > hg
view rust/hg-cpython/src/exceptions.rs @ 47954:4afd6cc447b9
rust: Make OwningDirstateMap generic and move it into hg-core
This will enable using it in rhg too.
The `OwningDirstateMap::new_empty` constructor is generic and accepts a value
of any type that gives acces to a bytes buffer. That buffer must stay valid
as long as the value hasn?t been dropped, and must keep its memory address
even if the value is moved. The `StableDeref` marker trait encodes those
constraints. Previously no trait was needed because the value was always
of type `PyBytes` which we know satisfies those constraints.
The buffer type is ereased in the struct itself through boxing and
dynamic dispatch, in order to simplify other signatures that mention
`OwningDirstateMap`.
Differential Revision: https://phab.mercurial-scm.org/D11396
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Thu, 09 Sep 2021 18:07:40 +0200 |
parents | f96b28aa4b79 |
children | 35ebe6f824be |
line wrap: on
line source
// ancestors.rs // // Copyright 2018 Georges Racinet <gracinet@anybox.fr> // // 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 Rust errors //! //! [`GraphError`] exposes `hg::GraphError` as a subclass of `ValueError` //! but some variants of `hg::GraphError` can be converted directly to other //! existing Python exceptions if appropriate. //! //! [`GraphError`]: struct.GraphError.html use cpython::{ exc::{RuntimeError, ValueError}, py_exception, PyErr, Python, }; use hg; py_exception!(rustext, GraphError, ValueError); impl GraphError { pub fn pynew(py: Python, inner: hg::GraphError) -> PyErr { match inner { hg::GraphError::ParentOutOfRange(r) => { GraphError::new(py, ("ParentOutOfRange", r)) } hg::GraphError::WorkingDirectoryUnsupported => { match py .import("mercurial.error") .and_then(|m| m.get(py, "WdirUnsupported")) { Err(e) => e, Ok(cls) => PyErr::from_instance(py, cls), } } } } } py_exception!(rustext, HgPathPyError, RuntimeError); py_exception!(rustext, FallbackError, RuntimeError); py_exception!(shared_ref, AlreadyBorrowed, RuntimeError);