@@ -2,7 +2,6 @@ use mlua::chunk;
22use mlua:: prelude:: * ;
33use rust_embed:: { EmbeddedFile , RustEmbed } ;
44use std:: str;
5- //use rusile::rusile;
65
76/// Embed everything that would otherwise be installed to datadir
87#[ derive( RustEmbed ) ]
@@ -46,7 +45,6 @@ pub struct SileModules;
4645// Link Lua loader functions from C modules that Lua would otherwise be loading externally that
4746// we've linked into the CLI binary. Linking happens in build-aux/build.rs.
4847extern "C-unwind" {
49- //fn luaopen_rusile(lua: *mut mlua::lua_State) -> i32;
5048 fn luaopen_fontmetrics ( lua : * mut mlua:: lua_State ) -> i32 ;
5149 fn luaopen_justenoughfontconfig ( lua : * mut mlua:: lua_State ) -> i32 ;
5250 fn luaopen_justenoughharfbuzz ( lua : * mut mlua:: lua_State ) -> i32 ;
@@ -58,18 +56,27 @@ extern "C-unwind" {
5856/// Register a Lua function in the loaders/searchers table to return C modules linked into the CLI
5957/// binary and another to return embedded Lua resources as Lua modules. See discussion in mlua:
6058/// https://github.com/khvzak/mlua/discussions/322
61- pub fn inject_embedded_loader ( lua : & Lua ) {
59+ pub fn inject_embedded_loaders ( lua : & Lua ) {
6260 let package: LuaTable = lua. globals ( ) . get ( "package" ) . unwrap ( ) ;
6361 let loaders: LuaTable = match package. get ( "loaders" ) . unwrap ( ) {
6462 LuaValue :: Table ( loaders) => loaders,
6563 LuaValue :: Nil => package. get ( "searchers" ) . unwrap ( ) ,
6664 _ => panic ! ( "Unable to find appropriate interface to inject embedded loader" ) ,
6765 } ;
68- let embedded_ffi_loader = lua. create_function ( |lua, module : String | unsafe {
66+
67+ let embedded_rusile_loader = lua
68+ . create_function ( |lua, module : String | match module. as_str ( ) {
69+ "rusile" => lua
70+ . create_function ( move |lua, _: ( ) | crate :: get_rusile_exports ( lua) )
71+ . map ( LuaValue :: Function ) ,
72+ _ => format ! ( "Module '{module}' is embeded in Rust binary" ) . into_lua ( lua) ,
73+ } )
74+ . unwrap ( ) ;
75+ loaders. push ( embedded_rusile_loader) . unwrap ( ) ;
76+
77+ let embedded_ffi_loader = lua
78+ . create_function ( |lua, module : String | unsafe {
6979 match module. as_str ( ) {
70- //"rusile" => lua
71- // .create_c_function(luaopen_rusile)
72- // .map(LuaValue::Function),
7380 "fontmetrics" => lua
7481 . create_c_function ( luaopen_fontmetrics)
7582 . map ( LuaValue :: Function ) ,
@@ -88,12 +95,12 @@ pub fn inject_embedded_loader(lua: &Lua) {
8895 "svg" => lua. create_c_function ( luaopen_svg) . map ( LuaValue :: Function ) ,
8996 _ => format ! ( "C Module '{module}' is not linked in Rust binary" ) . into_lua ( lua) ,
9097 }
91- } ) . unwrap ( ) ;
92- loaders
93- . push ( embedded_ffi_loader)
98+ } )
9499 . unwrap ( ) ;
100+ loaders. push ( embedded_ffi_loader) . unwrap ( ) ;
95101
96- let embedded_lua_loader = lua. create_function ( |lua, module : String | {
102+ let embedded_lua_loader = lua
103+ . create_function ( |lua, module : String | {
97104 let module_path = module. replace ( '.' , "/" ) ;
98105 let luaversion: LuaString = lua
99106 . load ( chunk ! {
@@ -121,40 +128,40 @@ pub fn inject_embedded_loader(lua: &Lua) {
121128 }
122129 }
123130 match resource_option {
124- Some ( module) => {
125- lua . create_function ( move |lua, _: ( ) | {
131+ Some ( module) => lua
132+ . create_function ( move |lua, _: ( ) | {
126133 let data = str:: from_utf8 ( module. data . as_ref ( ) )
127134 . expect ( "Embedded content is not valid UTF-8" ) ;
128135 lua. load ( data) . call :: < LuaValue > ( ( ) )
129- } ) . map ( LuaValue :: Function )
130- } ,
136+ } )
137+ . map ( LuaValue :: Function ) ,
131138
132139 None => format ! ( "Module '{module}' is not embedded in Rust binary" ) . into_lua ( lua) ,
133140 }
134- } ) . unwrap ( ) ;
135- loaders
136- . push ( embedded_lua_loader)
141+ } )
137142 . unwrap ( ) ;
143+ loaders. push ( embedded_lua_loader) . unwrap ( ) ;
138144
139- let embedded_ftl_loader = lua. create_function ( |lua, module : String | {
145+ let embedded_ftl_loader = lua
146+ . create_function ( |lua, module : String | {
140147 let module_path = module. replace ( '.' , "/" ) ;
141148 let pattern = "?.ftl" ;
142149 let path = pattern. replace ( '?' , & module_path) ;
143150 match SileModules :: get ( & path) {
144- Some ( module) => lua. create_function ( move |lua, _: ( ) | {
145- let data = str:: from_utf8 ( module. data . as_ref ( ) )
146- . expect ( "Embedded content is not valid UTF-8" ) ;
147- lua. load ( chunk ! {
148- return assert( fluent: add_messages( $data) )
151+ Some ( module) => lua
152+ . create_function ( move |lua, _: ( ) | {
153+ let data = str:: from_utf8 ( module. data . as_ref ( ) )
154+ . expect ( "Embedded content is not valid UTF-8" ) ;
155+ lua. load ( chunk ! {
156+ return assert( fluent: add_messages( $data) )
157+ } )
158+ . call :: < LuaValue > ( ( ) )
149159 } )
150- . call :: < LuaValue > ( ( ) )
151- } ) . map ( LuaValue :: Function ) ,
160+ . map ( LuaValue :: Function ) ,
152161 _ => format ! ( "FTL resource '{module_path}' is not embedded in Rust binary" )
153162 . into_lua ( lua) ,
154163 }
155- } ) . unwrap ( ) ;
156- loaders
157- . push ( embedded_ftl_loader)
164+ } )
158165 . unwrap ( ) ;
159-
166+ loaders . push ( embedded_ftl_loader ) . unwrap ( ) ;
160167}
0 commit comments