rust/hg-pyo3/src/exceptions.rs
author Georges Racinet <georges.racinet@cloudcrane.io>
Sat, 07 Dec 2024 18:38:37 +0100
changeset 52531 4c9e31984b3a
parent 52412 6e8ba52857df
child 52771 2fb13c3f4496
permissions -rw-r--r--
rust-pyo3: exposition of AncestorsIterator Compared to the early experiments, we have one less `RwLock` in the wrapping. Still that is somewhat redundant with `UnsafePyLeaked` being itself some kind of lock. In the original rust-cpython code, we were borrowing the `RefCell` with a method that can panic. Instead we are now converting the `PoisonError` that unlocking a `RwLock` can produce. Since all methods acquiring the `RwLock` are themselves protected by the GIL and do not release it before returning, nor do they leak RwLock guards, there is no risk of contention on these locks themselves.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52531
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
     1
use pyo3::exceptions::{PyRuntimeError, PyValueError};
52412
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
     2
use pyo3::import_exception;
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
     3
use pyo3::{create_exception, PyErr};
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
     4
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
     5
use crate::revision::PyRevision;
52408
20c0472b2ab7 rust-pyo3: defining GraphError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     6
20c0472b2ab7 rust-pyo3: defining GraphError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     7
create_exception!(pyo3_rustext, GraphError, PyValueError);
52412
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
     8
import_exception!(mercurial.error, WdirUnsupported);
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
     9
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    10
impl GraphError {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    11
    pub fn from_hg(inner: hg::GraphError) -> PyErr {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    12
        match inner {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    13
            hg::GraphError::ParentOutOfRange(r) => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    14
                GraphError::new_err(("ParentOutOfRange", PyRevision(r.0)))
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    15
            }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    16
        }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    17
    }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    18
    pub fn from_vcsgraph(inner: vcsgraph::graph::GraphReadError) -> PyErr {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    19
        match inner {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    20
            vcsgraph::graph::GraphReadError::InconsistentGraphData => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    21
                GraphError::new_err("InconsistentGraphData")
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    22
            }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    23
            vcsgraph::graph::GraphReadError::InvalidKey => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    24
                GraphError::new_err("ParentOutOfRange")
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    25
            }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    26
            vcsgraph::graph::GraphReadError::KeyedInvalidKey(r) => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    27
                GraphError::new_err(("ParentOutOfRange", r))
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    28
            }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    29
            vcsgraph::graph::GraphReadError::WorkingDirectoryUnsupported => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    30
                WdirUnsupported::new_err(())
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    31
            }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    32
        }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    33
    }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
    34
}
52531
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
    35
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
    36
pub fn map_lock_error<T>(e: std::sync::PoisonError<T>) -> PyErr {
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
    37
    PyRuntimeError::new_err(format!("In Rust PyO3 bindings: {e}"))
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
    38
}