Skip to content

Commit 4bc846a

Browse files
committed
Add optional anyhow dependency (under the same feature flag) to implement IntoLua for anyhow::Error
1 parent a3ca95f commit 4bc846a

File tree

4 files changed

+44
-1
lines changed

4 files changed

+44
-1
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ async = ["dep:futures-util"]
4141
send = ["parking_lot/send_guard"]
4242
serialize = ["dep:serde", "dep:erased-serde", "dep:serde-value"]
4343
macros = ["mlua_derive/macros"]
44+
anyhow = ["dep:anyhow"]
4445

4546
[dependencies]
4647
mlua_derive = { version = "=0.10.0-beta.1", optional = true, path = "mlua_derive" }
@@ -52,6 +53,7 @@ serde = { version = "1.0", optional = true }
5253
erased-serde = { version = "0.4", optional = true }
5354
serde-value = { version = "0.7", optional = true }
5455
parking_lot = { version = "0.12", features = ["arc_lock"] }
56+
anyhow = { version = "1.0", optional = true }
5557

5658
ffi = { package = "mlua-sys", version = "0.6.3", path = "mlua-sys" }
5759

src/conversion.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,14 @@ impl FromLua for Error {
254254
}
255255
}
256256

257+
#[cfg(feature = "anyhow")]
258+
impl IntoLua for anyhow::Error {
259+
#[inline]
260+
fn into_lua(self, _: &Lua) -> Result<Value> {
261+
Ok(Value::Error(Box::new(Error::from(self))))
262+
}
263+
}
264+
257265
impl IntoLua for RegistryKey {
258266
#[inline]
259267
fn into_lua(self, lua: &Lua) -> Result<Value> {

src/error.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ impl ErrorContext for Error {
454454
}
455455
}
456456

457-
impl<T> ErrorContext for StdResult<T, Error> {
457+
impl<T> ErrorContext for Result<T> {
458458
fn context<C: fmt::Display>(self, context: C) -> Self {
459459
self.map_err(|err| err.context(context))
460460
}
@@ -496,6 +496,16 @@ impl serde::de::Error for Error {
496496
}
497497
}
498498

499+
#[cfg(feature = "anyhow")]
500+
impl From<anyhow::Error> for Error {
501+
fn from(err: anyhow::Error) -> Self {
502+
match err.downcast::<Self>() {
503+
Ok(err) => err,
504+
Err(err) => Error::external(err),
505+
}
506+
}
507+
}
508+
499509
struct Chain<'a> {
500510
root: &'a Error,
501511
current: Option<&'a (dyn StdError + 'static)>,

tests/error.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,26 @@ fn test_error_chain() -> Result<()> {
7272

7373
Ok(())
7474
}
75+
76+
#[cfg(feature = "anyhow")]
77+
#[test]
78+
fn test_error_anyhow() -> Result<()> {
79+
use mlua::IntoLua;
80+
81+
let lua = Lua::new();
82+
83+
let err = anyhow::Error::msg("anyhow error");
84+
let val = err.into_lua(&lua)?;
85+
assert!(val.is_error());
86+
assert_eq!(val.as_error().unwrap().to_string(), "anyhow error");
87+
88+
// Try Error -> anyhow::Error -> Error roundtrip
89+
let err = Error::runtime("runtime error");
90+
let err = anyhow::Error::new(err);
91+
let err = err.into_lua(&lua)?;
92+
assert!(err.is_error());
93+
let err = err.as_error().unwrap();
94+
assert!(matches!(err, Error::RuntimeError(msg) if msg == "runtime error"));
95+
96+
Ok(())
97+
}

0 commit comments

Comments
 (0)