Mercurial > public > mercurial-scm > hg
annotate rust/hg-pyo3/src/exceptions.rs @ 52412:6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
The nice thing is that with PyO3, exceptions can be instantiated
without holding the GIL. Hence the only thing that prevents us to
implement `Into<PyErr>` for `hg::GraphError` is that neither is
defined by the current crate.
We could use a wrapping "newtype", but the compiler is not so clever yet that
it could chain automatically to two needed `into()`, so we'll end up with
some type conversion anyway, involving something like `GraphErrorWrapper`.
At this point, explicitly named methods are just simpler.
author | Georges Racinet <georges.racinet@octobus.net> |
---|---|
date | Thu, 05 Dec 2024 14:36:40 +0100 |
parents | 20c0472b2ab7 |
children | 4c9e31984b3a |
rev | line source |
---|---|
52408
20c0472b2ab7
rust-pyo3: defining GraphError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
1 use pyo3::exceptions::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 } |