File tree Expand file tree Collapse file tree 4 files changed +44
-1
lines changed
Expand file tree Collapse file tree 4 files changed +44
-1
lines changed Original file line number Diff line number Diff line change @@ -41,6 +41,7 @@ async = ["dep:futures-util"]
4141send = [" parking_lot/send_guard" ]
4242serialize = [" dep:serde" , " dep:erased-serde" , " dep:serde-value" ]
4343macros = [" mlua_derive/macros" ]
44+ anyhow = [" dep:anyhow" ]
4445
4546[dependencies ]
4647mlua_derive = { version = " =0.10.0-beta.1" , optional = true , path = " mlua_derive" }
@@ -52,6 +53,7 @@ serde = { version = "1.0", optional = true }
5253erased-serde = { version = " 0.4" , optional = true }
5354serde-value = { version = " 0.7" , optional = true }
5455parking_lot = { version = " 0.12" , features = [" arc_lock" ] }
56+ anyhow = { version = " 1.0" , optional = true }
5557
5658ffi = { package = " mlua-sys" , version = " 0.6.3" , path = " mlua-sys" }
5759
Original file line number Diff line number Diff 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+
257265impl IntoLua for RegistryKey {
258266 #[ inline]
259267 fn into_lua ( self , lua : & Lua ) -> Result < Value > {
Original file line number Diff line number Diff 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+
499509struct Chain < ' a > {
500510 root : & ' a Error ,
501511 current : Option < & ' a ( dyn StdError + ' static ) > ,
Original file line number Diff line number Diff 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+ }
You can’t perform that action at this time.
0 commit comments