mirror of
https://github.com/lune-org/lune.git
synced 2024-12-12 13:00:37 +00:00
Support require without extension for path requires
This commit is contained in:
parent
38994b941c
commit
4eb7d5ab8b
2 changed files with 57 additions and 5 deletions
|
@ -66,8 +66,6 @@ async fn require<'lua>(
|
||||||
where
|
where
|
||||||
'lua: 'static, // FIXME: Remove static lifetime bound here when builtin libraries no longer need it
|
'lua: 'static, // FIXME: Remove static lifetime bound here when builtin libraries no longer need it
|
||||||
{
|
{
|
||||||
// TODO: Use proper lua strings, os strings, to avoid lossy conversions
|
|
||||||
|
|
||||||
let source = source
|
let source = source
|
||||||
.to_str()
|
.to_str()
|
||||||
.into_lua_err()
|
.into_lua_err()
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
use mlua::prelude::*;
|
use mlua::prelude::*;
|
||||||
|
|
||||||
use super::context::*;
|
use super::context::*;
|
||||||
|
@ -11,11 +13,63 @@ where
|
||||||
'lua: 'ctx,
|
'lua: 'ctx,
|
||||||
{
|
{
|
||||||
let (abs_path, rel_path) = ctx.resolve_paths(source, path)?;
|
let (abs_path, rel_path) = ctx.resolve_paths(source, path)?;
|
||||||
if ctx.is_cached(&abs_path)? {
|
|
||||||
ctx.get_from_cache(&abs_path)
|
// 1. Try to require the exact path
|
||||||
} else if ctx.is_pending(&abs_path)? {
|
if let Ok(res) = require_inner(ctx, &abs_path, &rel_path).await {
|
||||||
|
return Ok(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Try to require the path with an added "luau" extension
|
||||||
|
let (luau_abs_path, luau_rel_path) = (
|
||||||
|
append_extension(&abs_path, "luau"),
|
||||||
|
append_extension(&rel_path, "luau"),
|
||||||
|
);
|
||||||
|
if let Ok(res) = require_inner(ctx, &luau_abs_path, &luau_rel_path).await {
|
||||||
|
return Ok(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Try to require the path with an added "lua" extension
|
||||||
|
let (lua_abs_path, lua_rel_path) = (
|
||||||
|
append_extension(&abs_path, "lua"),
|
||||||
|
append_extension(&rel_path, "lua"),
|
||||||
|
);
|
||||||
|
if let Ok(res) = require_inner(ctx, &lua_abs_path, &lua_rel_path).await {
|
||||||
|
return Ok(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nothing left to try, throw an error
|
||||||
|
Err(LuaError::runtime(format!(
|
||||||
|
"No file exist at the path '{}'",
|
||||||
|
rel_path.display()
|
||||||
|
)))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn require_inner<'lua, 'ctx>(
|
||||||
|
ctx: &'ctx RequireContext<'lua>,
|
||||||
|
abs_path: impl AsRef<Path>,
|
||||||
|
rel_path: impl AsRef<Path>,
|
||||||
|
) -> LuaResult<LuaMultiValue<'lua>>
|
||||||
|
where
|
||||||
|
'lua: 'ctx,
|
||||||
|
{
|
||||||
|
let abs_path = abs_path.as_ref();
|
||||||
|
let rel_path = rel_path.as_ref();
|
||||||
|
|
||||||
|
if ctx.is_cached(abs_path)? {
|
||||||
|
ctx.get_from_cache(abs_path)
|
||||||
|
} else if ctx.is_pending(abs_path)? {
|
||||||
ctx.wait_for_cache(&abs_path).await
|
ctx.wait_for_cache(&abs_path).await
|
||||||
} else {
|
} else {
|
||||||
ctx.load_with_caching(&abs_path, &rel_path).await
|
ctx.load_with_caching(&abs_path, &rel_path).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn append_extension(path: impl Into<PathBuf>, ext: &'static str) -> PathBuf {
|
||||||
|
let mut new = path.into();
|
||||||
|
match new.extension() {
|
||||||
|
// FUTURE: There's probably a better way to do this than converting to a lossy string
|
||||||
|
Some(e) => new.set_extension(format!("{}.{ext}", e.to_string_lossy())),
|
||||||
|
None => new.set_extension(ext),
|
||||||
|
};
|
||||||
|
new
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue