1- use mlua:: { IntoLua , Lua , Result , Value } ;
1+ use mlua:: { IntoLua , Lua , MultiValue , Result , Value } ;
22
33fn run_require ( lua : & Lua , path : impl IntoLua ) -> Result < Value > {
44 lua. load ( r#"return require(...)"# ) . call ( path)
55}
66
7+ fn run_require_pcall ( lua : & Lua , path : impl IntoLua ) -> Result < MultiValue > {
8+ lua. load ( r#"return pcall(require, ...)"# ) . call ( path)
9+ }
10+
711#[ track_caller]
812fn get_str ( value : & Value , key : impl IntoLua ) -> String {
913 value. as_table ( ) . unwrap ( ) . get :: < String > ( key) . unwrap ( )
@@ -32,6 +36,13 @@ fn test_require_errors() {
3236 assert ! ( res. is_err( ) ) ;
3337 assert ! ( ( res. unwrap_err( ) . to_string( ) )
3438 . contains( "bad argument #1 to 'require' (string expected, got boolean)" ) ) ;
39+
40+ // Require from loadstring
41+ let res = lua
42+ . load ( r#"return loadstring("require('./a/relative/path')")()"# )
43+ . eval :: < Value > ( ) ;
44+ assert ! ( res. is_err( ) ) ;
45+ assert ! ( ( res. unwrap_err( ) . to_string( ) ) . contains( "require is not supported in this context" ) ) ;
3546}
3647
3748#[ test]
@@ -42,6 +53,11 @@ fn test_require_without_config() {
4253 let res = run_require ( & lua, "./require/without_config/dependency" ) . unwrap ( ) ;
4354 assert_eq ! ( "result from dependency" , get_str( & res, 1 ) ) ;
4455
56+ // RequireSimpleRelativePathWithinPcall
57+ let res = run_require_pcall ( & lua, "./require/without_config/dependency" ) . unwrap ( ) ;
58+ assert ! ( res[ 0 ] . as_boolean( ) . unwrap( ) ) ;
59+ assert_eq ! ( "result from dependency" , get_str( & res[ 1 ] , 1 ) ) ;
60+
4561 // RequireRelativeToRequiringFile
4662 let res = run_require ( & lua, "./require/without_config/module" ) . unwrap ( ) ;
4763 assert_eq ! ( "result from dependency" , get_str( & res, 1 ) ) ;
@@ -59,10 +75,24 @@ fn test_require_without_config() {
5975 let res = run_require ( & lua, "./require/without_config/lua" ) . unwrap ( ) ;
6076 assert_eq ! ( "result from init.lua" , get_str( & res, 1 ) ) ;
6177
62- // RequireSubmoduleUsingSelf
78+ // RequireSubmoduleUsingSelfIndirectly
6379 let res = run_require ( & lua, "./require/without_config/nested_module_requirer" ) . unwrap ( ) ;
6480 assert_eq ! ( "result from submodule" , get_str( & res, 1 ) ) ;
6581
82+ // RequireSubmoduleUsingSelfDirectly
83+ let res = run_require ( & lua, "./require/without_config/nested" ) . unwrap ( ) ;
84+ assert_eq ! ( "result from submodule" , get_str( & res, 1 ) ) ;
85+
86+ // CannotRequireInitLuauDirectly
87+ let res = run_require ( & lua, "./require/without_config/nested/init" ) ;
88+ assert ! ( res. is_err( ) ) ;
89+ assert ! ( ( res. unwrap_err( ) . to_string( ) ) . contains( "could not resolve child component \" init\" " ) ) ;
90+
91+ // RequireNestedInits
92+ let res = run_require ( & lua, "./require/without_config/nested_inits_requirer" ) . unwrap ( ) ;
93+ assert_eq ! ( "result from nested_inits/init" , get_str( & res, 1 ) ) ;
94+ assert_eq ! ( "required into module" , get_str( & res, 2 ) ) ;
95+
6696 // RequireWithFileAmbiguity
6797 let res = run_require ( & lua, "./require/without_config/ambiguous_file_requirer" ) ;
6898 assert ! ( res. is_err( ) ) ;
0 commit comments