11use mlua:: prelude:: * ;
2- use std:: { env, path } ;
2+ use std:: env;
33
44#[ tokio:: main( flavor = "current_thread" ) ]
55async fn main ( ) -> LuaResult < ( ) > {
6+ dynamic_set_root ( ) ;
7+
68 let lua = unsafe { Lua :: unsafe_new ( ) } ;
79 luals_basic:: lua_preload ( & lua) ?;
810
9- #[ cfg( not( debug_assertions) ) ]
10- {
11- let exe_path = env:: current_exe ( ) . unwrap ( ) ;
12- let exe_dir = exe_path. parent ( ) . unwrap ( ) ;
13- std:: env:: set_current_dir ( exe_dir) ?;
14- }
15-
1611 build_args ( & lua) ;
17- let main = lua. load ( path:: Path :: new ( "resources/main.lua" ) ) ;
12+ let current_path = std:: env:: current_dir ( ) ?;
13+ let main_path = current_path. join ( "main.lua" ) ;
14+ let main = lua. load ( main_path) ;
1815 main. call_async ( ( ) ) . await ?;
1916 Ok ( ( ) )
2017}
@@ -30,8 +27,25 @@ fn build_args(lua: &Lua) {
3027 lua. globals ( ) . set ( "arg" , table) . unwrap ( ) ;
3128}
3229
30+ fn dynamic_set_root ( ) {
31+ let exe_path = env:: current_exe ( ) . unwrap ( ) ;
32+ let mut current_dir = exe_path. parent ( ) . unwrap ( ) ;
33+
34+ while !current_dir. join ( "main.lua" ) . exists ( ) {
35+ if let Some ( parent) = current_dir. parent ( ) {
36+ current_dir = parent;
37+ } else {
38+ break ;
39+ }
40+ }
41+
42+ std:: env:: set_current_dir ( current_dir) . unwrap ( ) ;
43+ }
44+
3345#[ cfg( test) ]
3446mod tests {
47+ use std:: path;
48+
3549 use tokio:: runtime:: Builder ;
3650
3751 use super :: * ;
@@ -44,7 +58,7 @@ mod tests {
4458 eprintln ! ( "Error during lua_preload: {:?}" , e) ;
4559 return ;
4660 }
47- let main = lua. load ( path:: Path :: new ( "resources/ test.lua" ) ) ;
61+ let main = lua. load ( path:: Path :: new ( "test.lua" ) ) ;
4862 main. call_async :: < ( ) > ( ( ) ) . await . unwrap ( ) ;
4963 } ) ;
5064 }
0 commit comments