Skip to content

Commit f4d783c

Browse files
committed
Impl push_into_stack for StdResult
1 parent f5982bc commit f4d783c

File tree

3 files changed

+88
-38
lines changed

3 files changed

+88
-38
lines changed

src/multi.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,20 @@ impl<'lua, T: IntoLua<'lua>, E: IntoLua<'lua>> IntoLuaMulti<'lua> for StdResult<
2323
}
2424
Ok(result)
2525
}
26+
27+
#[inline]
28+
unsafe fn push_into_stack_multi(self, lua: &'lua Lua) -> Result<c_int> {
29+
match self {
30+
Ok(v) => v.push_into_stack(lua).map(|_| 1),
31+
Err(e) => {
32+
let state = lua.state();
33+
check_stack(state, 3)?;
34+
ffi::lua_pushnil(state);
35+
e.push_into_stack(lua)?;
36+
Ok(2)
37+
}
38+
}
39+
}
2640
}
2741

2842
impl<'lua, E: IntoLua<'lua>> IntoLuaMulti<'lua> for StdResult<(), E> {
@@ -38,6 +52,20 @@ impl<'lua, E: IntoLua<'lua>> IntoLuaMulti<'lua> for StdResult<(), E> {
3852
}
3953
}
4054
}
55+
56+
#[inline]
57+
unsafe fn push_into_stack_multi(self, lua: &'lua Lua) -> Result<c_int> {
58+
match self {
59+
Ok(_) => Ok(0),
60+
Err(e) => {
61+
let state = lua.state();
62+
check_stack(state, 3)?;
63+
ffi::lua_pushnil(state);
64+
e.push_into_stack(lua)?;
65+
Ok(2)
66+
}
67+
}
68+
}
4169
}
4270

4371
impl<'lua, T: IntoLua<'lua>> IntoLuaMulti<'lua> for T {

tests/multi.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use mlua::{Error, ExternalError, IntoLuaMulti, Lua, Result, String, Value};
2+
3+
#[test]
4+
fn test_result_conversions() -> Result<()> {
5+
let lua = Lua::new();
6+
let globals = lua.globals();
7+
8+
let ok = lua.create_function(|_, ()| Ok(Ok::<(), Error>(())))?;
9+
let err = lua.create_function(|_, ()| Ok(Err::<(), _>("failure1".into_lua_err())))?;
10+
let ok2 = lua.create_function(|_, ()| Ok(Ok::<_, Error>("!".to_owned())))?;
11+
let err2 = lua.create_function(|_, ()| Ok(Err::<String, _>("failure2".into_lua_err())))?;
12+
13+
globals.set("ok", ok)?;
14+
globals.set("ok2", ok2)?;
15+
globals.set("err", err)?;
16+
globals.set("err2", err2)?;
17+
18+
lua.load(
19+
r#"
20+
local r, e = ok()
21+
assert(r == nil and e == nil)
22+
23+
local r, e = err()
24+
assert(r == nil)
25+
assert(tostring(e):find("failure1") ~= nil)
26+
27+
local r, e = ok2()
28+
assert(r == "!")
29+
assert(e == nil)
30+
31+
local r, e = err2()
32+
assert(r == nil)
33+
assert(tostring(e):find("failure2") ~= nil)
34+
"#,
35+
)
36+
.exec()?;
37+
38+
// Try to convert Result into MultiValue
39+
let ok1 = Ok::<(), Error>(());
40+
let multi_ok1 = ok1.into_lua_multi(&lua)?;
41+
assert_eq!(multi_ok1.len(), 0);
42+
let err1 = Err::<(), _>("failure1");
43+
let multi_err1 = err1.into_lua_multi(&lua)?;
44+
assert_eq!(multi_err1.len(), 2);
45+
assert_eq!(multi_err1[0], Value::Nil);
46+
assert_eq!(multi_err1[1].as_str().unwrap(), "failure1");
47+
48+
let ok2 = Ok::<_, Error>("!");
49+
let multi_ok2 = ok2.into_lua_multi(&lua)?;
50+
assert_eq!(multi_ok2.len(), 1);
51+
assert_eq!(multi_ok2[0].as_str().unwrap(), "!");
52+
let err2 = Err::<String, _>("failure2".into_lua_err());
53+
let multi_err2 = err2.into_lua_multi(&lua)?;
54+
assert_eq!(multi_err2.len(), 2);
55+
assert_eq!(multi_err2[0], Value::Nil);
56+
assert!(matches!(multi_err2[1], Value::Error(_)));
57+
assert_eq!(multi_err2[1].to_string()?, "failure2");
58+
59+
Ok(())
60+
}

tests/tests.rs

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -504,44 +504,6 @@ fn test_panic() -> Result<()> {
504504
Ok(())
505505
}
506506

507-
#[test]
508-
fn test_result_conversions() -> Result<()> {
509-
let lua = Lua::new();
510-
let globals = lua.globals();
511-
512-
let ok = lua.create_function(|_, ()| Ok(Ok::<(), Error>(())))?;
513-
let err = lua.create_function(|_, ()| Ok(Err::<(), _>("failure1".into_lua_err())))?;
514-
let ok2 = lua.create_function(|_, ()| Ok(Ok::<_, Error>("!".to_owned())))?;
515-
let err2 = lua.create_function(|_, ()| Ok(Err::<String, _>("failure2".into_lua_err())))?;
516-
517-
globals.set("ok", ok)?;
518-
globals.set("ok2", ok2)?;
519-
globals.set("err", err)?;
520-
globals.set("err2", err2)?;
521-
522-
lua.load(
523-
r#"
524-
local r, e = ok()
525-
assert(r == nil and e == nil)
526-
527-
local r, e = err()
528-
assert(r == nil)
529-
assert(tostring(e):find("failure1") ~= nil)
530-
531-
local r, e = ok2()
532-
assert(r == "!")
533-
assert(e == nil)
534-
535-
local r, e = err2()
536-
assert(r == nil)
537-
assert(tostring(e):find("failure2") ~= nil)
538-
"#,
539-
)
540-
.exec()?;
541-
542-
Ok(())
543-
}
544-
545507
#[test]
546508
fn test_num_conversion() -> Result<()> {
547509
let lua = Lua::new();

0 commit comments

Comments
 (0)