fixed not converting cached results

This commit is contained in:
highflowey 2024-08-23 04:21:36 +03:30
parent fedaf9a625
commit 25b09b18ac
4 changed files with 45 additions and 9 deletions

View file

@ -30,7 +30,7 @@ impl RequireContext {
} }
} }
pub fn std_exists(lua: &Lua, alias: &str) -> LuaResult<bool> { pub(crate) fn std_exists(lua: &Lua, alias: &str) -> LuaResult<bool> {
let data_ref = lua let data_ref = lua
.app_data_ref::<RequireContextData>() .app_data_ref::<RequireContextData>()
.ok_or(LuaError::runtime("Couldn't find RequireContextData in app data container, make sure RequireStorage::init is called on this lua instance"))?; .ok_or(LuaError::runtime("Couldn't find RequireContextData in app data container, make sure RequireStorage::init is called on this lua instance"))?;
@ -38,13 +38,18 @@ impl RequireContext {
Ok(data_ref.std.contains_key(alias)) Ok(data_ref.std.contains_key(alias))
} }
pub fn require_std(lua: &Lua, require_alias: RequireAlias) -> LuaResult<LuaMultiValue<'_>> { pub(crate) fn require_std(
lua: &Lua,
require_alias: RequireAlias,
) -> LuaResult<LuaMultiValue<'_>> {
let data_ref = lua let data_ref = lua
.app_data_ref::<RequireContextData>() .app_data_ref::<RequireContextData>()
.ok_or(LuaError::runtime("Couldn't find RequireContextData in app data container, make sure RequireStorage::init is called on this lua instance"))?; .ok_or(LuaError::runtime("Couldn't find RequireContextData in app data container, make sure RequireStorage::init is called on this lua instance"))?;
if let Some(cached) = data_ref.std_cache.get(&require_alias) { if let Some(cached) = data_ref.std_cache.get(&require_alias) {
return cached.into_lua(lua)?.into_lua_multi(lua); let multi_vec = lua.registry_value::<Vec<LuaValue>>(cached)?;
return Ok(LuaMultiValue::from_vec(multi_vec));
} }
let libraries = let libraries =
@ -76,7 +81,7 @@ impl RequireContext {
Ok(multi) Ok(multi)
} }
pub async fn require( pub(crate) async fn require(
lua: &Lua, lua: &Lua,
path_rel: PathBuf, path_rel: PathBuf,
path_abs: PathBuf, path_abs: PathBuf,
@ -105,7 +110,9 @@ impl RequireContext {
let cache = data_ref.cache.lock().await; let cache = data_ref.cache.lock().await;
if let Some(cached) = cache.get(&path_abs) { if let Some(cached) = cache.get(&path_abs) {
return cached.into_lua(lua).into_lua_multi(lua); let multi_vec = lua.registry_value::<Vec<LuaValue>>(cached)?;
return Ok(LuaMultiValue::from_vec(multi_vec));
} }
} }

View file

@ -7,7 +7,7 @@ use mlua::prelude::*;
use path::resolve_path; use path::resolve_path;
use std::path::PathBuf; use std::path::PathBuf;
mod context; pub mod context;
mod path; mod path;
pub async fn lua_require(lua: &Lua, path: String) -> LuaResult<LuaMultiValue> { pub async fn lua_require(lua: &Lua, path: String) -> LuaResult<LuaMultiValue> {

View file

@ -1,5 +1,5 @@
use mlua::prelude::*; use mlua::prelude::*;
use std::path::{Path, PathBuf}; use std::path::{Component, Path, PathBuf};
use tokio::fs; use tokio::fs;
/// tries these alternatives on given path: /// tries these alternatives on given path:
@ -14,20 +14,47 @@ pub async fn resolve_path(path: &Path) -> LuaResult<PathBuf> {
let path = append_extension(path, ext); let path = append_extension(path, ext);
if fs::try_exists(&path).await? { if fs::try_exists(&path).await? {
return Ok(path); return Ok(normalize_path(&path));
}; };
// try extension on given path's init // try extension on given path's init
let init_path = append_extension(init_path, ext); let init_path = append_extension(init_path, ext);
if fs::try_exists(&init_path).await? { if fs::try_exists(&init_path).await? {
return Ok(init_path); return Ok(normalize_path(&init_path));
}; };
} }
Err(LuaError::runtime("Could not resolve path")) Err(LuaError::runtime("Could not resolve path"))
} }
pub fn normalize_path(path: &Path) -> PathBuf {
let mut components = path.components().peekable();
let mut ret = if let Some(c @ Component::Prefix(..)) = components.clone().peek() {
components.next();
PathBuf::from(c.as_os_str())
} else {
PathBuf::new()
};
for component in components {
match component {
Component::Prefix(..) => unreachable!(),
Component::RootDir => {
ret.push(component.as_os_str());
}
Component::CurDir => {}
Component::ParentDir => {
ret.pop();
}
Component::Normal(c) => {
ret.push(c);
}
}
}
ret
}
fn append_extension(path: impl Into<PathBuf>, ext: &'static str) -> PathBuf { fn append_extension(path: impl Into<PathBuf>, ext: &'static str) -> PathBuf {
let mut new = path.into(); let mut new = path.into();
match new.extension() { match new.extension() {

View file

@ -1,5 +1,7 @@
#![allow(clippy::cargo_common_metadata)] #![allow(clippy::cargo_common_metadata)]
pub use globals::require::context::RequireContext;
use mlua::prelude::*; use mlua::prelude::*;
mod global; mod global;