diff --git a/src/multi.rs b/src/multi.rs index d68ce8d..f5e4e10 100644 --- a/src/multi.rs +++ b/src/multi.rs @@ -15,6 +15,22 @@ impl<'lua> FromLuaMulti<'lua> for () { } } +impl<'lua, T: ToLua<'lua>, E: ToLua<'lua>> ToLuaMulti<'lua> for Result { + fn to_lua_multi(self, lua: &'lua Lua) -> LuaResult> { + let mut result = LuaMultiValue::new(); + + match self { + Ok(v) => result.push_back(v.to_lua(lua)?), + Err(e) => { + result.push_back(LuaNil); + result.push_back(e.to_lua(lua)?); + } + } + + Ok(result) + } +} + impl<'lua, T: ToLua<'lua>> ToLuaMulti<'lua> for T { fn to_lua_multi(self, lua: &'lua Lua) -> LuaResult> { let mut v = LuaMultiValue::new(); diff --git a/src/tests.rs b/src/tests.rs index b67ea4b..8c5942a 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -625,3 +625,32 @@ fn test_table_error() { assert!(bad_table.pairs::().is_ok()); assert!(bad_table.array_values::().is_ok()); } + +#[test] +fn test_result_conversions() { + let lua = Lua::new(); + let globals = lua.globals().unwrap(); + + let err = lua.create_function(|lua, args| { + lua.pack(Result::Err::("only through failure can we succeed".to_string())) + }).unwrap(); + let ok = lua.create_function(|lua, args| { + lua.pack(Result::Ok::("!".to_string())) + }).unwrap(); + + globals.set("err", err).unwrap(); + globals.set("ok", ok).unwrap(); + + lua.load::<()>( + r#" + local err, msg = err() + assert(err == nil) + assert(msg == "only through failure can we succeed") + + local ok, extra = ok() + assert(ok == "!") + assert(extra == nil) + "#, + None, + ).unwrap(); +}