Skip to content

Commit f67f864

Browse files
committed
Implement push_into_stack/from_stack for Option<T>
1 parent fa217d3 commit f67f864

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

src/conversion.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,15 @@ impl<'lua, T: IntoLua<'lua>> IntoLua<'lua> for Option<T> {
10631063
None => Ok(Nil),
10641064
}
10651065
}
1066+
1067+
#[inline]
1068+
unsafe fn push_into_stack(self, lua: &'lua Lua) -> Result<()> {
1069+
match self {
1070+
Some(val) => val.push_into_stack(lua)?,
1071+
None => ffi::lua_pushnil(lua.state()),
1072+
}
1073+
Ok(())
1074+
}
10661075
}
10671076

10681077
impl<'lua, T: FromLua<'lua>> FromLua<'lua> for Option<T> {
@@ -1073,4 +1082,13 @@ impl<'lua, T: FromLua<'lua>> FromLua<'lua> for Option<T> {
10731082
value => Ok(Some(T::from_lua(value, lua)?)),
10741083
}
10751084
}
1085+
1086+
#[inline]
1087+
unsafe fn from_stack(idx: c_int, lua: &'lua Lua) -> Result<Self> {
1088+
if ffi::lua_isnil(lua.state(), idx) != 0 {
1089+
Ok(None)
1090+
} else {
1091+
Ok(Some(T::from_stack(idx, lua)?))
1092+
}
1093+
}
10761094
}

tests/conversion.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,3 +453,21 @@ fn test_bstring_from_lua_buffer() -> Result<()> {
453453

454454
Ok(())
455455
}
456+
457+
#[test]
458+
fn test_option_into_from_lua() -> Result<()> {
459+
let lua = Lua::new();
460+
461+
// Direct conversion
462+
let v = Some(42);
463+
let v2 = v.into_lua(&lua)?;
464+
assert_eq!(v, v2.as_i32());
465+
466+
// Push into stack / get from stack
467+
let f = lua.create_function(|_, v: Option<i32>| Ok(v))?;
468+
assert_eq!(f.call::<_, Option<i32>>(Some(42))?, Some(42));
469+
assert_eq!(f.call::<_, Option<i32>>(Option::<i32>::None)?, None);
470+
assert_eq!(f.call::<_, Option<i32>>(())?, None);
471+
472+
Ok(())
473+
}

0 commit comments

Comments
 (0)