mlua_extras/extras/
require.rs1use mlua::{Error, FromLua, Table};
2
3pub trait Require<'lua> {
24 fn require<R: FromLua<'lua>>(&'lua self, path: impl AsRef<str>) -> mlua::Result<R>;
26}
27
28impl<'lua> Require<'lua> for Table<'lua> {
29 fn require<R: FromLua<'lua>>(&'lua self, path: impl AsRef<str>) -> mlua::Result<R> {
30 let segments = path
31 .as_ref()
32 .split('.')
33 .filter_map(|v| (!v.trim().is_empty()).then_some(v.trim()))
34 .collect::<Vec<_>>();
35
36 let mut module = self.clone();
37 if !segments.is_empty() {
38 for seg in &segments[..segments.len() - 1] {
39 module = module.get::<_, Table>(*seg)?;
40 }
41 }
42
43 match segments.last() {
44 Some(seg) => module.get::<_, R>(*seg),
45 None => Err(Error::runtime(format!(
46 "module not found: {:?}",
47 path.as_ref()
48 ))),
49 }
50 }
51}