mirror of
https://github.com/lune-org/lune.git
synced 2025-05-04 10:43:57 +01:00
refactor: implement 'CompileOptions' & 'LoadOptions' for class luau.*
method options
This commit is contained in:
parent
34a44be3ff
commit
b4ff4a5b06
1 changed files with 101 additions and 38 deletions
|
@ -3,6 +3,99 @@ use mlua::Compiler as LuaCompiler;
|
||||||
|
|
||||||
use crate::lune::lua::table::TableBuilder;
|
use crate::lune::lua::table::TableBuilder;
|
||||||
|
|
||||||
|
const DEFAULT_DEBUG_NAME: &str = "luau.load(...)";
|
||||||
|
|
||||||
|
struct CompileOptions {
|
||||||
|
pub optimization_level: u8,
|
||||||
|
pub coverage_level: u8,
|
||||||
|
pub debug_level: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for CompileOptions {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
optimization_level: 1,
|
||||||
|
coverage_level: 0,
|
||||||
|
debug_level: 1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'lua> FromLua<'lua> for CompileOptions {
|
||||||
|
fn from_lua(value: LuaValue<'lua>, _: &'lua Lua) -> LuaResult<Self> {
|
||||||
|
Ok(match value {
|
||||||
|
LuaValue::Nil => Self {
|
||||||
|
optimization_level: 1,
|
||||||
|
coverage_level: 0,
|
||||||
|
debug_level: 1,
|
||||||
|
},
|
||||||
|
LuaValue::Table(t) => {
|
||||||
|
let optimization_level: Option<u8> = t.get("optimizationLevel")?;
|
||||||
|
let coverage_level: Option<u8> = t.get("coverageLevel")?;
|
||||||
|
let debug_level: Option<u8> = t.get("debugLevel")?;
|
||||||
|
|
||||||
|
Self {
|
||||||
|
optimization_level: optimization_level.unwrap_or(1),
|
||||||
|
coverage_level: coverage_level.unwrap_or(0),
|
||||||
|
debug_level: debug_level.unwrap_or(1),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
return Err(LuaError::FromLuaConversionError {
|
||||||
|
from: value.type_name(),
|
||||||
|
to: "CompileOptions",
|
||||||
|
message: Some(format!(
|
||||||
|
"Invalid compile options - expected table, got {}",
|
||||||
|
value.type_name()
|
||||||
|
)),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LoadOptions {
|
||||||
|
pub debug_name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for LoadOptions {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
debug_name: DEFAULT_DEBUG_NAME.to_string(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'lua> FromLua<'lua> for LoadOptions {
|
||||||
|
fn from_lua(value: LuaValue<'lua>, _: &'lua Lua) -> LuaResult<Self> {
|
||||||
|
Ok(match value {
|
||||||
|
LuaValue::Nil => Self {
|
||||||
|
debug_name: DEFAULT_DEBUG_NAME.to_string(),
|
||||||
|
},
|
||||||
|
LuaValue::Table(t) => {
|
||||||
|
let debug_name: Option<String> = t.get("debugName")?;
|
||||||
|
|
||||||
|
Self {
|
||||||
|
debug_name: debug_name.unwrap_or(DEFAULT_DEBUG_NAME.to_string()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LuaValue::String(s) => Self {
|
||||||
|
debug_name: s.to_str()?.to_string(),
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
return Err(LuaError::FromLuaConversionError {
|
||||||
|
from: value.type_name(),
|
||||||
|
to: "LoadOptions",
|
||||||
|
message: Some(format!(
|
||||||
|
"Invalid compile options - expected string or table, got {}",
|
||||||
|
value.type_name()
|
||||||
|
)),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn create(lua: &'static Lua) -> LuaResult<LuaTable> {
|
pub fn create(lua: &'static Lua) -> LuaResult<LuaTable> {
|
||||||
TableBuilder::new(lua)?
|
TableBuilder::new(lua)?
|
||||||
.with_function("compile", compile_source)?
|
.with_function("compile", compile_source)?
|
||||||
|
@ -12,36 +105,13 @@ pub fn create(lua: &'static Lua) -> LuaResult<LuaTable> {
|
||||||
|
|
||||||
fn compile_source<'lua>(
|
fn compile_source<'lua>(
|
||||||
lua: &'lua Lua,
|
lua: &'lua Lua,
|
||||||
(source, options): (LuaString<'lua>, Option<LuaTable<'lua>>),
|
(source, options): (LuaString<'lua>, Option<CompileOptions>),
|
||||||
) -> LuaResult<LuaString<'lua>> {
|
) -> LuaResult<LuaString<'lua>> {
|
||||||
let mut optimization_level = 1;
|
let _options = options.unwrap_or_default();
|
||||||
let mut coverage_level = 0;
|
|
||||||
let mut debug_level = 1;
|
|
||||||
|
|
||||||
if let Some(options) = options {
|
|
||||||
optimization_level = match options.raw_get("optimizationLevel")? {
|
|
||||||
LuaValue::Integer(val) => val as u8,
|
|
||||||
LuaValue::Number(val) => val as u8,
|
|
||||||
_ => optimization_level,
|
|
||||||
};
|
|
||||||
|
|
||||||
coverage_level = match options.raw_get("coverageLevel")? {
|
|
||||||
LuaValue::Integer(val) => val as u8,
|
|
||||||
LuaValue::Number(val) => val as u8,
|
|
||||||
_ => coverage_level,
|
|
||||||
};
|
|
||||||
|
|
||||||
debug_level = match options.raw_get("debugLevel")? {
|
|
||||||
LuaValue::Integer(val) => val as u8,
|
|
||||||
LuaValue::Number(val) => val as u8,
|
|
||||||
_ => debug_level,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
let source_bytecode_bytes = LuaCompiler::default()
|
let source_bytecode_bytes = LuaCompiler::default()
|
||||||
.set_optimization_level(optimization_level)
|
.set_optimization_level(_options.optimization_level)
|
||||||
.set_coverage_level(coverage_level)
|
.set_coverage_level(_options.coverage_level)
|
||||||
.set_debug_level(debug_level)
|
.set_debug_level(_options.debug_level)
|
||||||
.compile(source);
|
.compile(source);
|
||||||
|
|
||||||
lua.create_string(source_bytecode_bytes)
|
lua.create_string(source_bytecode_bytes)
|
||||||
|
@ -49,18 +119,11 @@ fn compile_source<'lua>(
|
||||||
|
|
||||||
fn load_source<'a>(
|
fn load_source<'a>(
|
||||||
lua: &'static Lua,
|
lua: &'static Lua,
|
||||||
(source, options): (LuaString<'a>, Option<LuaTable<'a>>),
|
(source, options): (LuaString<'a>, Option<LoadOptions>),
|
||||||
) -> LuaResult<LuaFunction<'a>> {
|
) -> LuaResult<LuaFunction<'a>> {
|
||||||
let mut lua_debug_name = None;
|
let _options = options.unwrap_or_default();
|
||||||
|
|
||||||
if let Some(options) = options {
|
|
||||||
lua_debug_name = match options.raw_get("debugName")? {
|
|
||||||
LuaValue::String(val) => Some(val.to_str()?.to_string()),
|
|
||||||
_ => lua_debug_name,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
lua.load(source.to_str()?.trim_start())
|
lua.load(source.to_str()?.trim_start())
|
||||||
.set_name(lua_debug_name.unwrap_or("luau.load(...)".to_string()))
|
.set_name(_options.debug_name)
|
||||||
.into_function()
|
.into_function()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue