Macro python_comm::raise_error[][src]

macro_rules! raise_error {
    ("py", $func : ident, $text : expr, "\n", $err : expr) => { ... };
    ($func : ident, $text : expr, "\n", $err : expr) => { ... };
    ($func : ident, "\n", $err : expr) => { ... };
    ($func : ident, $text : expr) => { ... };
}
Expand description

Generate pyo3:: pyerr or anyhow:: error with file name, line number and function

Usage

use pyo3::{prepare_freethreaded_python, Python};
use python_comm::raise_error_use::*;
use python_comm_macros::auto_func_name;

prepare_freethreaded_python();

let gil = Python::acquire_gil();
let py = gil.python();

#[auto_func_name]
fn test(py:Python) -> Result<(), anyhow::Error> {
  let v = Ok(2).and(Err("e"));

  // Usage 1: generate pyo3::PyErr
  let _a = v.or_else(|err| raise_error!("py", __func__, "some text", "\n", err));

  // Usage 2: generate anyhow::Error, including supplementary instruction and another error
  let b = v.or_else(|err| raise_error!(__func__, "some text", "\n", err));

  // Usage 3: generate anyhow::Error, including another error
  let _c = v.or_else(|err| raise_error!(__func__, "\n", err));

  // Usage 4: generate anyhow::Error, including supplementary description
  let _d = v.or_else(|_err| Err(raise_error!(__func__, "some text")));

  b
}

let err = format!("{:?}", test(py).err().unwrap());
let msg1 = "Error: src\\macros.rs:21 test() some text\n\"e\"";
let msg2 = "Error: src/macros.rs:21 test() some text\n\"e\"";
assert!(err == msg1 || err == msg2, "\n left: {:?}\n  msg1:{:?}\n  msg2:{:?}", err, msg1, msg2);