diff 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
line wrap: on
line diff
--- a/rust/hg-pyo3/src/exceptions.rs	Sat Nov 30 20:57:02 2024 +0100
+++ b/rust/hg-pyo3/src/exceptions.rs	Thu Dec 05 14:36:40 2024 +0100
@@ -1,4 +1,34 @@
-use pyo3::create_exception;
 use pyo3::exceptions::PyValueError;
+use pyo3::import_exception;
+use pyo3::{create_exception, PyErr};
+
+use crate::revision::PyRevision;
 
 create_exception!(pyo3_rustext, GraphError, PyValueError);
+import_exception!(mercurial.error, WdirUnsupported);
+
+impl GraphError {
+    pub fn from_hg(inner: hg::GraphError) -> PyErr {
+        match inner {
+            hg::GraphError::ParentOutOfRange(r) => {
+                GraphError::new_err(("ParentOutOfRange", PyRevision(r.0)))
+            }
+        }
+    }
+    pub fn from_vcsgraph(inner: vcsgraph::graph::GraphReadError) -> PyErr {
+        match inner {
+            vcsgraph::graph::GraphReadError::InconsistentGraphData => {
+                GraphError::new_err("InconsistentGraphData")
+            }
+            vcsgraph::graph::GraphReadError::InvalidKey => {
+                GraphError::new_err("ParentOutOfRange")
+            }
+            vcsgraph::graph::GraphReadError::KeyedInvalidKey(r) => {
+                GraphError::new_err(("ParentOutOfRange", r))
+            }
+            vcsgraph::graph::GraphReadError::WorkingDirectoryUnsupported => {
+                WdirUnsupported::new_err(())
+            }
+        }
+    }
+}