luaurc error impl

This commit is contained in:
highflowey 2024-08-23 03:36:38 +03:30
parent 13cff6ff00
commit 2eb167025a
4 changed files with 33 additions and 14 deletions

1
Cargo.lock generated
View file

@ -1571,6 +1571,7 @@ dependencies = [
"mlua-luau-scheduler", "mlua-luau-scheduler",
"serde", "serde",
"serde_json", "serde_json",
"thiserror",
"tokio", "tokio",
] ]

View file

@ -45,6 +45,8 @@ serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
tokio = { version = "1", default-features = false, features = ["fs", "sync"] } tokio = { version = "1", default-features = false, features = ["fs", "sync"] }
thiserror = "1.0.63"
lune-utils = { version = "0.1.3", path = "../lune-utils" } lune-utils = { version = "0.1.3", path = "../lune-utils" }
lune-std-datetime = { optional = true, version = "0.1.3", path = "../lune-std-datetime" } lune-std-datetime = { optional = true, version = "0.1.3", path = "../lune-std-datetime" }

View file

@ -8,7 +8,7 @@ mod path;
pub async fn lua_require(lua: &Lua, path: String) -> LuaResult<LuaMultiValue> { pub async fn lua_require(lua: &Lua, path: String) -> LuaResult<LuaMultiValue> {
let require_path_rel = PathBuf::from(path); let require_path_rel = PathBuf::from(path);
let require_alias = path_to_alias(&require_path_rel)?; let require_alias = path_to_alias(&require_path_rel).into_lua_err()?;
if let Some(require_alias) = require_alias { if let Some(require_alias) = require_alias {
if context::RequireContext::std_exists(lua, &require_alias.alias)? { if context::RequireContext::std_exists(lua, &require_alias.alias)? {

View file

@ -1,11 +1,11 @@
use crate::path::get_parent_path; use crate::path::get_parent_path;
use mlua::ExternalResult;
use serde::Deserialize; use serde::Deserialize;
use std::{ use std::{
collections::HashMap, collections::HashMap,
env::current_dir, env::current_dir,
path::{Path, PathBuf}, path::{Path, PathBuf},
}; };
use thiserror::Error;
use tokio::fs; use tokio::fs;
#[derive(Debug, Clone, Eq, Hash, PartialEq)] #[derive(Debug, Clone, Eq, Hash, PartialEq)]
@ -19,6 +19,23 @@ pub struct Luaurc {
aliases: Option<HashMap<String, PathBuf>>, aliases: Option<HashMap<String, PathBuf>>,
} }
#[derive(Debug, Error)]
pub enum LuaurcError {
#[error("Require with alias doesn't contain '/'")]
UsedAliasWithoutSlash,
#[error("Failed to convert string to path")]
FailedStringToPathConversion,
#[error("Failed to find a path for alias '{0}' in .luaurc files")]
FailedToFindAlias(String),
#[error("IOError: {0}")]
IOError(#[from] std::io::Error),
#[error("JsonError: {0}")]
JsonError(#[from] serde_json::Error),
#[error("LuaError: {0}")]
LuaError(#[from] mlua::Error),
}
/// Parses path into `RequireAlias` struct /// Parses path into `RequireAlias` struct
/// ///
/// ### Examples /// ### Examples
@ -26,15 +43,15 @@ pub struct Luaurc {
/// `@lune/task` becomes `Some({ alias: "lune", path: "task" })` /// `@lune/task` becomes `Some({ alias: "lune", path: "task" })`
/// ///
/// `../path/script` becomes `None` /// `../path/script` becomes `None`
pub fn path_to_alias(path: &Path) -> Result<Option<RequireAlias>, mlua::Error> { pub fn path_to_alias(path: &Path) -> Result<Option<RequireAlias>, LuaurcError> {
if let Some(aliased_path) = path if let Some(aliased_path) = path
.to_str() .to_str()
.ok_or(mlua::Error::runtime("Couldn't turn path into string"))? .ok_or(LuaurcError::FailedStringToPathConversion)?
.strip_prefix('@') .strip_prefix('@')
{ {
let (alias, path) = aliased_path.split_once('/').ok_or(mlua::Error::runtime( let (alias, path) = aliased_path
"Require with alias doesn't contain '/'", .split_once('/')
))?; .ok_or(LuaurcError::UsedAliasWithoutSlash)?;
Ok(Some(RequireAlias { Ok(Some(RequireAlias {
alias: alias.to_string(), alias: alias.to_string(),
@ -45,10 +62,12 @@ pub fn path_to_alias(path: &Path) -> Result<Option<RequireAlias>, mlua::Error> {
} }
} }
async fn parse_luaurc(_: &mlua::Lua, path: &PathBuf) -> Result<Option<Luaurc>, mlua::Error> { async fn parse_luaurc(_: &mlua::Lua, path: &PathBuf) -> Result<Option<Luaurc>, LuaurcError> {
if fs::try_exists(path).await? { if fs::try_exists(path).await? {
let content = fs::read(path).await?; let content = fs::read(path).await?;
serde_json::from_slice(&content).map(Some).into_lua_err() serde_json::from_slice(&content)
.map(Some)
.map_err(|x| x.into())
} else { } else {
Ok(None) Ok(None)
} }
@ -60,7 +79,7 @@ impl Luaurc {
pub async fn resolve_path<'lua>( pub async fn resolve_path<'lua>(
lua: &'lua mlua::Lua, lua: &'lua mlua::Lua,
alias: &'lua RequireAlias, alias: &'lua RequireAlias,
) -> Result<PathBuf, mlua::Error> { ) -> Result<PathBuf, LuaurcError> {
let cwd = current_dir()?; let cwd = current_dir()?;
let parent = cwd.join(get_parent_path(lua)?); let parent = cwd.join(get_parent_path(lua)?);
let ancestors = parent.ancestors(); let ancestors = parent.ancestors();
@ -81,9 +100,6 @@ impl Luaurc {
} }
} }
Err(mlua::Error::runtime(format!( Err(LuaurcError::FailedToFindAlias(alias.alias.to_string()))
"Coudln't find the alias '{}' in any .luaurc file",
alias.alias
)))
} }
} }