More output formatting improvements

This commit is contained in:
Filip Tibell 2023-01-21 17:02:49 -05:00
parent 7814282d3d
commit 3689eb17d2
No known key found for this signature in database
5 changed files with 47 additions and 9 deletions

View file

@ -14,9 +14,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- Improved general formatting of errors to make them more readable & glanceable
- Improved output formatting of non-primitive types - Improved output formatting of non-primitive types
- Improved output formatting of empty tables - Improved output formatting of empty tables
### Fixed
- Fixed double stack trace for certain kinds of errors
## `0.0.4` - January 21st, 2023 ## `0.0.4` - January 21st, 2023
### Added ### Added

View file

@ -96,7 +96,10 @@ impl Cli {
// Display the file path relative to cwd with no extensions in stack traces // Display the file path relative to cwd with no extensions in stack traces
let file_display_name = file_path.with_extension("").display().to_string(); let file_display_name = file_path.with_extension("").display().to_string();
// Create a new lune object with all globals & run the script // Create a new lune object with all globals & run the script
run_lune(&file_display_name, &file_contents, self.script_args).await?; if let Err(e) = run_lune(&file_display_name, &file_contents, self.script_args).await {
eprintln!("{e}");
std::process::exit(1);
};
Ok(()) Ok(())
} }
} }

View file

@ -10,6 +10,7 @@ use crate::utils::table_builder::ReadonlyTableBuilder;
const DEFAULT_SLEEP_DURATION: f32 = 1.0 / 60.0; const DEFAULT_SLEEP_DURATION: f32 = 1.0 / 60.0;
#[allow(dead_code)]
pub struct WaitingThread<'a> { pub struct WaitingThread<'a> {
is_delayed_for: Option<f32>, is_delayed_for: Option<f32>,
is_deferred: Option<bool>, is_deferred: Option<bool>,
@ -17,7 +18,7 @@ pub struct WaitingThread<'a> {
args: Variadic<Value<'a>>, args: Variadic<Value<'a>>,
} }
pub fn new<'a>(lua: &'a Lua, threads: &Arc<Mutex<Vec<WaitingThread<'a>>>>) -> Result<Table<'a>> { pub fn new<'a>(lua: &'a Lua, _threads: &Arc<Mutex<Vec<WaitingThread<'a>>>>) -> Result<Table<'a>> {
// TODO: Figure out how to insert into threads vec // TODO: Figure out how to insert into threads vec
ReadonlyTableBuilder::new(lua)? ReadonlyTableBuilder::new(lua)?
.with_async_function( .with_async_function(

View file

@ -57,7 +57,7 @@ mod tests {
.await .await
.unwrap(); .unwrap();
if let Err(e) = run_lune($value, &script, args).await { if let Err(e) = run_lune($value, &script, args).await {
panic!("Test '{}' failed!\n{}", $value, e.to_string()) panic!("\nTest '{}' failed!\n{}\n", $value, e.to_string())
} }
} }
)* )*

View file

@ -191,24 +191,34 @@ pub fn pretty_format_multi_value(multi: &MultiValue) -> mlua::Result<String> {
} }
pub fn pretty_format_luau_error(e: &mlua::Error) -> String { pub fn pretty_format_luau_error(e: &mlua::Error) -> String {
match e { let stack_begin = format!("[{}Stack Begin{}]", COLOR_BLUE, COLOR_RESET);
let stack_end = format!("[{}Stack End{}]", COLOR_BLUE, COLOR_RESET);
let err_string = match e {
mlua::Error::RuntimeError(e) => { mlua::Error::RuntimeError(e) => {
// Add "Stack Begin" instead of default stack traceback string
let err_string = e.to_string(); let err_string = e.to_string();
let mut err_lines = err_string.lines().collect::<Vec<_>>(); let mut err_lines = err_string
.lines()
.map(|s| s.to_string())
.collect::<Vec<String>>();
for (index, line) in err_lines.clone().iter().enumerate().rev() { for (index, line) in err_lines.clone().iter().enumerate().rev() {
if *line == "stack traceback:" { if *line == "stack traceback:" {
err_lines[index] = "Stack Begin"; err_lines[index] = stack_begin;
break; break;
} }
} }
err_lines.push("Stack End"); // Add "Stack End" to the very end of the stack trace for symmetry
err_lines.push(stack_end);
err_lines.join("\n") err_lines.join("\n")
} }
mlua::Error::CallbackError { cause, traceback } => { mlua::Error::CallbackError { cause, traceback } => {
// Same error formatting as above
format!( format!(
"{}\nStack Begin{}Stack End", "{}\n{}{}{}",
pretty_format_luau_error(cause.as_ref()), pretty_format_luau_error(cause.as_ref()),
traceback.strip_prefix("stack traceback:\n").unwrap() stack_begin,
traceback.strip_prefix("stack traceback:\n").unwrap(),
stack_end
) )
} }
mlua::Error::ToLuaConversionError { from, to, message } => { mlua::Error::ToLuaConversionError { from, to, message } => {
@ -230,5 +240,24 @@ pub fn pretty_format_luau_error(e: &mlua::Error) -> String {
) )
} }
e => format!("{e}"), e => format!("{e}"),
};
let mut err_lines = err_string.lines().collect::<Vec<_>>();
// Remove the script path from the error message
// itself, it can be found in the stack trace
if let Some(first_line) = err_lines.first() {
if first_line.starts_with("[string \"") {
if let Some(closing_bracket) = first_line.find("]:") {
let after_closing_bracket = &first_line[closing_bracket + 2..first_line.len()];
if let Some(last_colon) = after_closing_bracket.find(": ") {
err_lines[0] = &after_closing_bracket
[last_colon + 2..first_line.len() - closing_bracket - 2];
} else {
err_lines[0] = after_closing_bracket
} }
}
}
}
// Reformat stack trace lines, ignore lines that just mention C functions
// Merge all lines back together into one string
err_lines.join("\n")
} }