Skip to content

Commit 5b1cfbe

Browse files
committed
Add Array() type of LuaMessage. Add def_fn() (a wrapper and shortcut for create_function())
1 parent 91c2729 commit 5b1cfbe

File tree

3 files changed

+152
-24
lines changed

3 files changed

+152
-24
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "lua_actor"
3-
version = "0.1.5"
3+
version = "0.1.6"
44
license = "MIT"
55
authors = ["JunYi JohnTeee Lee <johnteee@gmail.com>"]
66
include = ["src/**/*.rs", "Cargo.toml"]

src/actor.rs

Lines changed: 72 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use fp_rust::{
66
sync::{CountDownLatch},
77
handler::{Handler,HandlerThread},
88
};
9-
use rlua::{Lua,Error,Error::RuntimeError,Function};
9+
use rlua::{Lua,Error,Error::RuntimeError,Function,FromLuaMulti,ToLuaMulti,Variadic};
1010
use message::LuaMessage;
1111

1212
#[derive(Clone)]
@@ -47,7 +47,7 @@ impl Actor {
4747
}
4848
}
4949

50-
pub fn set_global(&self, key: String, value: LuaMessage) -> Result<(), Error> {
50+
pub fn set_global(&self, key: &'static str, value: LuaMessage) -> Result<(), Error> {
5151
match self.handler.clone() {
5252
Some(_handler) => {
5353
let lua = self.lua.clone();
@@ -62,13 +62,13 @@ impl Actor {
6262
}
6363
}
6464
}
65-
fn _set_global(lua: Arc<Mutex<Lua>>, key: String, value: LuaMessage) -> Result<(), Error> {
65+
fn _set_global(lua: Arc<Mutex<Lua>>, key: &str, value: LuaMessage) -> Result<(), Error> {
6666
let vm = lua.lock().unwrap();
6767
let globals = vm.globals();
6868
Ok(globals.set(key, value)?)
6969
}
7070

71-
pub fn get_global(&self, key: String) -> Result<LuaMessage, Error> {
71+
pub fn get_global(&self, key: &'static str) -> Result<LuaMessage, Error> {
7272
match self.handler.clone() {
7373
Some(_handler) => {
7474
let _result : Arc<Mutex<Result<LuaMessage, Error>>> = Arc::new(Mutex::new(Err(RuntimeError(String::from("")))));
@@ -109,11 +109,29 @@ impl Actor {
109109
},
110110
}
111111
}
112-
fn _get_global(lua: Arc<Mutex<Lua>>, key: String) -> Result<LuaMessage, Error> {
112+
fn _get_global(lua: Arc<Mutex<Lua>>, key: &str) -> Result<LuaMessage, Error> {
113113
let vm = lua.lock().unwrap();
114114
let globals = vm.globals();
115115
Ok(globals.get::<_, LuaMessage>(key)?)
116116
}
117+
pub fn def_fn<'lua, 'callback, F, A, R>(lua: &'lua Lua, func: F) -> Result<Function<'lua>, Error>
118+
where
119+
A: FromLuaMulti<'callback>,
120+
R: ToLuaMulti<'callback>,
121+
F: 'static + Send + Fn(&'callback Lua, A) -> Result<R, Error>
122+
{
123+
Ok(lua.create_function(func)?)
124+
}
125+
pub fn def_fn_with_name<'lua, 'callback, F, A, R>(lua: &'lua Lua, func: F, key: &str) -> Result<Function<'lua>, Error>
126+
where
127+
A: FromLuaMulti<'callback>,
128+
R: ToLuaMulti<'callback>,
129+
F: 'static + Send + Fn(&'callback Lua, A) -> Result<R, Error>
130+
{
131+
let def = lua.create_function(func)?;
132+
lua.globals().set(key, def)?;
133+
Ok(lua.globals().get::<_, Function<'lua>>(key)?)
134+
}
117135

118136
pub fn load<'lua>(lua: &'lua Lua, source: &str, name: Option<&str>) -> Result<Function<'lua>, Error> {
119137
let vm = lua;
@@ -244,38 +262,72 @@ impl Actor {
244262
}
245263
pub fn _call(lua: Arc<Mutex<Lua>>, name: &str, args: LuaMessage) -> Result<LuaMessage, Error> {
246264
let vm = lua.lock().unwrap();
247-
let func: Function = vm.globals().get(name)?;
265+
let func: Function = vm.globals().get::<_, Function>(name)?;
266+
267+
println!("{:?}", 1234);
248268
Ok(func.call::<_, LuaMessage>(args)?)
249269
}
250270
}
251271

252272
#[test]
253273
fn test_actor_new() {
254274

255-
fn test_actor(act: Actor) -> Result<(), Error> {
256-
act.exec(r#"
275+
fn test_actor(act: Actor) {
276+
let _ = act.exec(r#"
257277
i = 1
258-
"#, None)?;
259-
assert_eq!(Some(1), Option::from(act.get_global("i".to_string())?));
278+
"#, None);
279+
assert_eq!(Some(1), Option::from(act.get_global("i").ok().unwrap()));
260280

261281
let v = act.eval(r#"
262282
3
263283
"#, None);
264-
assert_eq!(Some(3), Option::from(v?));
284+
assert_eq!(Some(3), Option::from(v.ok().unwrap()));
285+
286+
act.exec(r#"
287+
function testit (i)
288+
return i + 1
289+
end
290+
"#, None).ok().unwrap();
291+
match act.call("testit", LuaMessage::from(1)) {
292+
Ok(_v) => {
293+
assert_eq!(Some(2), Option::from(_v));
294+
},
295+
Err(_err) => {
296+
println!("{:?}", _err);
297+
panic!(_err);
298+
},
299+
}
265300

266301
{
267302
let vm = act.lua();
268-
let vm = &*vm.lock().unwrap();
269-
Actor::load(&vm, r#"
270-
function test(i)
271-
return i + 1
272-
end
273-
"#, None)?;
303+
let vm = vm.lock().unwrap();
304+
Actor::def_fn_with_name(&vm, |_, (list1, list2): (Vec<String>, Vec<String>)| {
305+
// This function just checks whether two string lists are equal, and in an inefficient way.
306+
// Lua callbacks return `rlua::Result`, an Ok value is a normal return, and an Err return
307+
// turns into a Lua 'error'. Again, any type that is convertible to lua may be returned.
308+
Ok(list1 == list2)
309+
}, "check_equal").ok().unwrap();
310+
Actor::def_fn_with_name(&vm, |_, strings: Variadic<String>| {
311+
// (This is quadratic!, it's just an example!)
312+
Ok(strings.iter().fold("".to_owned(), |a, b| a + b))
313+
}, "join").ok().unwrap();
314+
assert_eq!(
315+
vm.eval::<bool>(r#"check_equal({"a", "b", "c"}, {"a", "b", "c"})"#, None).ok().unwrap(),
316+
true
317+
);
318+
assert_eq!(
319+
vm.eval::<bool>(r#"check_equal({"a", "b", "c"}, {"d", "e", "f"})"#, None).ok().unwrap(),
320+
false
321+
);
322+
assert_eq!(vm.eval::<String>(r#"join("a", "b", "c")"#, None).ok().unwrap(), "abc");
274323
}
275-
assert_eq!(Some(2), Option::from(act.call("test", LuaMessage::from(1))?));
276-
assert_eq!(Some(3), Option::from(act.call("test", LuaMessage::from(2))?));
277324

278-
Ok(())
325+
act.set_global("arr1", LuaMessage::from(vec!(LuaMessage::from(1), LuaMessage::from(2)))).ok().unwrap();
326+
327+
let v = Option::<Vec<LuaMessage>>::from(act.get_global("arr1").ok().unwrap());
328+
assert_eq!(LuaMessage::from(1), v.clone().unwrap()[0]);
329+
assert_eq!(LuaMessage::from(2), v.clone().unwrap()[1]);
330+
assert_eq!(2, v.clone().unwrap().len());
279331
}
280332

281333
let _ = test_actor(Actor::new_with_handler(None));

src/message.rs

Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/*!
2-
Credits: https://github.com/poga/actix-lua/blob/master/src/message.rs
2+
Credits(mainly, except Array & reverse convertions):
3+
https://github.com/poga/actix-lua/blob/master/src/message.rs
34
*/
45

56
use rlua::Result as LuaResult;
@@ -14,6 +15,7 @@ pub enum LuaMessage {
1415
Boolean(bool),
1516
Nil,
1617
Table(HashMap<String, LuaMessage>),
18+
Array(Vec<LuaMessage>),
1719
}
1820

1921
impl From<bool> for LuaMessage {
@@ -45,6 +47,9 @@ impl From<LuaMessage> for Option<bool> {
4547
LuaMessage::Table(_h) => {
4648
Some(_h.len() > 0)
4749
},
50+
LuaMessage::Array(_h) => {
51+
Some(_h.len() > 0)
52+
},
4853
}
4954
}
5055
}
@@ -80,6 +85,9 @@ impl From<LuaMessage> for Option<String> {
8085
LuaMessage::Table(_h) => {
8186
Some(format!("{:?}",_h))
8287
},
88+
LuaMessage::Array(_h) => {
89+
Some(format!("{:?}",_h))
90+
},
8391
}
8492
}
8593
}
@@ -114,6 +122,9 @@ macro_rules! lua_message_number_convert {
114122
LuaMessage::Table(_h) => {
115123
None
116124
},
125+
LuaMessage::Array(_h) => {
126+
None
127+
},
117128
}
118129
}
119130
}
@@ -175,6 +186,50 @@ impl From<LuaMessage> for Option<HashMap<String, LuaMessage>> {
175186
LuaMessage::Table(_h) => {
176187
Some(_h)
177188
},
189+
LuaMessage::Array(_h) => {
190+
let mut new_one = HashMap::new();
191+
for (k, v) in _h.into_iter().enumerate() {
192+
new_one.insert(k.to_string(), v);
193+
}
194+
Some(new_one)
195+
},
196+
}
197+
}
198+
}
199+
impl From<Vec<LuaMessage>> for LuaMessage {
200+
fn from(s: Vec<LuaMessage>) -> Self {
201+
LuaMessage::Array(s)
202+
}
203+
}
204+
impl From<LuaMessage> for Option<Vec<LuaMessage>> {
205+
fn from(s: LuaMessage) -> Self {
206+
match s {
207+
LuaMessage::String(s) => {
208+
Some(vec!(LuaMessage::from(s)))
209+
},
210+
LuaMessage::Integer(i) => {
211+
Some(vec!(LuaMessage::from(i)))
212+
},
213+
LuaMessage::Number(f) => {
214+
Some(vec!(LuaMessage::from(f)))
215+
},
216+
LuaMessage::Boolean(b) => {
217+
Some(vec!(LuaMessage::from(b)))
218+
},
219+
LuaMessage::Nil => {
220+
None
221+
},
222+
LuaMessage::Table(_h) => {
223+
let mut new_one = vec!();
224+
for (_k, v) in _h.into_iter() {
225+
new_one.push(LuaMessage::from(_k));
226+
new_one.push(v);
227+
}
228+
Some(new_one)
229+
},
230+
LuaMessage::Array(_h) => {
231+
Some(_h)
232+
},
178233
}
179234
}
180235
}
@@ -202,8 +257,14 @@ impl<'lua> FromLua<'lua> for LuaMessage {
202257
Value::Boolean(b) => Ok(LuaMessage::Boolean(b)),
203258
Value::Nil => Ok(LuaMessage::Nil),
204259
Value::Table(t) => {
205-
Ok(LuaMessage::Table(HashMap::from_lua(Value::Table(t), lua)?))
206-
}
260+
if t.len()? > 0
261+
&& t.clone().pairs::<i32, LuaMessage>().count() == t.clone().sequence_values::<LuaMessage>().count()
262+
{
263+
Ok(LuaMessage::Array(Vec::from_lua(Value::Table(t), lua)?))
264+
} else {
265+
Ok(LuaMessage::Table(HashMap::from_lua(Value::Table(t), lua)?))
266+
}
267+
},
207268

208269
_ => unimplemented!(),
209270
}
@@ -219,6 +280,7 @@ impl<'lua> ToLua<'lua> for LuaMessage {
219280
LuaMessage::Boolean(x) => Ok(Value::Boolean(x)),
220281
LuaMessage::Nil => Ok(Value::Nil),
221282
LuaMessage::Table(x) => Ok(Value::Table(lua.create_table_from(x)?)),
283+
LuaMessage::Array(x) => Ok(Value::Table(lua.create_sequence_from(x)?)),
222284

223285
// You should not create RPCNotifyLater from outside of lua
224286
// _ => unimplemented!(),
@@ -317,5 +379,19 @@ mod tests {
317379
),
318380
discriminant(&LuaMessage::Table(t))
319381
);
382+
383+
let t = vec!(LuaMessage::from(1),LuaMessage::from(2));
384+
assert_eq!(
385+
discriminant(
386+
&LuaMessage::from_lua(
387+
Value::Table(lua.create_sequence_from(vec!(LuaMessage::from(1),LuaMessage::from(2))).unwrap()), &lua
388+
).unwrap()
389+
),
390+
discriminant(&LuaMessage::Array(t.clone()))
391+
);
392+
393+
// println!("{:?}\n{:?}", LuaMessage::Array(t.clone()), LuaMessage::from_lua(
394+
// Value::Table(lua.create_sequence_from(vec!(LuaMessage::from(12),LuaMessage::from(2))).unwrap()), &lua
395+
// ).unwrap());
320396
}
321397
}

0 commit comments

Comments
 (0)