@@ -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 } ;
1010use 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]
253273fn 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 ) ) ;
0 commit comments