From 3cfe1a65278c2679ba06677961ae58d73116e259 Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Fri, 26 May 2023 12:21:02 +1000 Subject: [PATCH] Use .pretty() instead of defining Display as pretty version --- valuescript_program_embed/src/main.rs | 4 +- valuescript_vm/src/builtins/array_builtin.rs | 2 +- .../src/builtins/boolean_builtin.rs | 2 +- valuescript_vm/src/builtins/debug_builtin.rs | 4 +- valuescript_vm/src/builtins/error_builtin.rs | 4 +- valuescript_vm/src/builtins/math_builtin.rs | 2 +- valuescript_vm/src/builtins/number_builtin.rs | 2 +- .../src/builtins/range_error_builtin.rs | 4 +- valuescript_vm/src/builtins/string_builtin.rs | 2 +- valuescript_vm/src/builtins/symbol_builtin.rs | 2 +- .../src/builtins/type_error_builtin.rs | 4 +- valuescript_vm/src/native_frame_function.rs | 2 +- valuescript_vm/src/native_function.rs | 2 +- valuescript_vm/src/vs_array.rs | 2 +- valuescript_vm/src/vs_pointer.rs | 4 +- valuescript_vm/src/vs_value.rs | 42 ++++++++++++------- vstc/src/run_command.rs | 4 +- 17 files changed, 49 insertions(+), 39 deletions(-) diff --git a/valuescript_program_embed/src/main.rs b/valuescript_program_embed/src/main.rs index ac21753..70bb3fb 100644 --- a/valuescript_program_embed/src/main.rs +++ b/valuescript_program_embed/src/main.rs @@ -52,9 +52,9 @@ pub fn main() { ); match result { - Ok(result) => println!("{}", result), + Ok(result) => println!("{}", result.pretty()), Err(err) => { - println!("Uncaught exception: {}", err); + println!("Uncaught exception: {}", err.pretty()); exit(1); } } diff --git a/valuescript_vm/src/builtins/array_builtin.rs b/valuescript_vm/src/builtins/array_builtin.rs index c17225f..2c86b05 100644 --- a/valuescript_vm/src/builtins/array_builtin.rs +++ b/valuescript_vm/src/builtins/array_builtin.rs @@ -82,7 +82,7 @@ impl ValTrait for ArrayBuiltin { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[Array]\x1b[39m") } diff --git a/valuescript_vm/src/builtins/boolean_builtin.rs b/valuescript_vm/src/builtins/boolean_builtin.rs index 000401e..9a064af 100644 --- a/valuescript_vm/src/builtins/boolean_builtin.rs +++ b/valuescript_vm/src/builtins/boolean_builtin.rs @@ -74,7 +74,7 @@ impl ValTrait for BooleanBuiltin { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[Boolean]\x1b[39m") } diff --git a/valuescript_vm/src/builtins/debug_builtin.rs b/valuescript_vm/src/builtins/debug_builtin.rs index cede229..8d42ca7 100644 --- a/valuescript_vm/src/builtins/debug_builtin.rs +++ b/valuescript_vm/src/builtins/debug_builtin.rs @@ -77,7 +77,7 @@ impl ValTrait for DebugBuiltin { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[Debug]\x1b[39m") } @@ -89,7 +89,7 @@ impl ValTrait for DebugBuiltin { static LOG: NativeFunction = NativeFunction { fn_: |_this: ThisWrapper, params: Vec| -> Result { for p in params { - println!("Debug.log: {}", p); + println!("Debug.log: {}", p.pretty()); } Ok(Val::Undefined) diff --git a/valuescript_vm/src/builtins/error_builtin.rs b/valuescript_vm/src/builtins/error_builtin.rs index 186a79e..b299db9 100644 --- a/valuescript_vm/src/builtins/error_builtin.rs +++ b/valuescript_vm/src/builtins/error_builtin.rs @@ -88,7 +88,7 @@ impl ValTrait for ErrorBuiltin { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[Error]\x1b[39m") } @@ -153,6 +153,6 @@ static SET_MESSAGE: NativeFunction = NativeFunction { static ERROR_TO_STRING: NativeFunction = NativeFunction { fn_: |this: ThisWrapper, _params: Vec| -> Result { let message = op_sub(this.get().clone(), "message".to_val())?; - Ok(format!("Error({})", message).to_val()) // TODO: Fixes needed here (and other errors) + Ok(format!("Error({})", message.val_to_string()).to_val()) // TODO: Fixes needed here (and other errors) }, }; diff --git a/valuescript_vm/src/builtins/math_builtin.rs b/valuescript_vm/src/builtins/math_builtin.rs index 252d669..21d1f83 100644 --- a/valuescript_vm/src/builtins/math_builtin.rs +++ b/valuescript_vm/src/builtins/math_builtin.rs @@ -122,7 +122,7 @@ impl ValTrait for MathBuiltin { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[Math]\x1b[39m") } diff --git a/valuescript_vm/src/builtins/number_builtin.rs b/valuescript_vm/src/builtins/number_builtin.rs index 201dced..7a3b063 100644 --- a/valuescript_vm/src/builtins/number_builtin.rs +++ b/valuescript_vm/src/builtins/number_builtin.rs @@ -92,7 +92,7 @@ impl ValTrait for NumberBuiltin { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[Number]\x1b[39m") } diff --git a/valuescript_vm/src/builtins/range_error_builtin.rs b/valuescript_vm/src/builtins/range_error_builtin.rs index 4409d54..b53acab 100644 --- a/valuescript_vm/src/builtins/range_error_builtin.rs +++ b/valuescript_vm/src/builtins/range_error_builtin.rs @@ -80,7 +80,7 @@ impl ValTrait for RangeErrorBuiltin { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[RangeError]\x1b[39m") } @@ -135,7 +135,7 @@ static SET_MESSAGE: NativeFunction = NativeFunction { static RANGE_ERROR_TO_STRING: NativeFunction = NativeFunction { fn_: |this: ThisWrapper, _params: Vec| -> Result { let message = op_sub(this.get().clone(), "message".to_val())?; - Ok(format!("RangeError({})", message).to_val()) + Ok(format!("RangeError({})", message.val_to_string()).to_val()) }, }; diff --git a/valuescript_vm/src/builtins/string_builtin.rs b/valuescript_vm/src/builtins/string_builtin.rs index 0069ee4..1832180 100644 --- a/valuescript_vm/src/builtins/string_builtin.rs +++ b/valuescript_vm/src/builtins/string_builtin.rs @@ -85,7 +85,7 @@ impl ValTrait for StringBuiltin { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[String]\x1b[39m") } diff --git a/valuescript_vm/src/builtins/symbol_builtin.rs b/valuescript_vm/src/builtins/symbol_builtin.rs index f7ebf62..92de415 100644 --- a/valuescript_vm/src/builtins/symbol_builtin.rs +++ b/valuescript_vm/src/builtins/symbol_builtin.rs @@ -77,7 +77,7 @@ impl ValTrait for SymbolBuiltin { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[Symbol]\x1b[39m") } diff --git a/valuescript_vm/src/builtins/type_error_builtin.rs b/valuescript_vm/src/builtins/type_error_builtin.rs index c97ebce..4b5fbd5 100644 --- a/valuescript_vm/src/builtins/type_error_builtin.rs +++ b/valuescript_vm/src/builtins/type_error_builtin.rs @@ -86,7 +86,7 @@ impl ValTrait for TypeErrorBuiltin { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[TypeError]\x1b[39m") } @@ -124,7 +124,7 @@ static SET_MESSAGE: NativeFunction = NativeFunction { static TYPE_ERROR_TO_STRING: NativeFunction = NativeFunction { fn_: |this: ThisWrapper, _params: Vec| -> Result { let message = op_sub(this.get().clone(), "message".to_val())?; - Ok(format!("TypeError({})", message).to_val()) + Ok(format!("TypeError({})", message.val_to_string()).to_val()) }, }; diff --git a/valuescript_vm/src/native_frame_function.rs b/valuescript_vm/src/native_frame_function.rs index d136399..e8c2839 100644 --- a/valuescript_vm/src/native_frame_function.rs +++ b/valuescript_vm/src/native_frame_function.rs @@ -73,7 +73,7 @@ impl ValTrait for NativeFrameFunction { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[Function]\x1b[39m") } diff --git a/valuescript_vm/src/native_function.rs b/valuescript_vm/src/native_function.rs index bda2cc0..7a62347 100644 --- a/valuescript_vm/src/native_function.rs +++ b/valuescript_vm/src/native_function.rs @@ -95,7 +95,7 @@ impl ValTrait for NativeFunction { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[Function]\x1b[39m") } diff --git a/valuescript_vm/src/vs_array.rs b/valuescript_vm/src/vs_array.rs index b2afb3c..eebb328 100644 --- a/valuescript_vm/src/vs_array.rs +++ b/valuescript_vm/src/vs_array.rs @@ -152,7 +152,7 @@ impl ValTrait for ArrayPrototype { LoadFunctionResult::NotAFunction } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "\x1b[36m[Array Prototype]\x1b[39m") } diff --git a/valuescript_vm/src/vs_pointer.rs b/valuescript_vm/src/vs_pointer.rs index 6ecf9b5..5d6f0cc 100644 --- a/valuescript_vm/src/vs_pointer.rs +++ b/valuescript_vm/src/vs_pointer.rs @@ -154,8 +154,8 @@ impl ValTrait for VsPointer { self.resolve().next() } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - self.resolve().fmt(f) + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.resolve().pretty_fmt(f) } fn codify(&self) -> String { diff --git a/valuescript_vm/src/vs_value.rs b/valuescript_vm/src/vs_value.rs index abce682..5a23574 100644 --- a/valuescript_vm/src/vs_value.rs +++ b/valuescript_vm/src/vs_value.rs @@ -109,14 +109,14 @@ pub trait ValTrait { fn next(&mut self) -> LoadFunctionResult; - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result; + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result; fn codify(&self) -> String; } impl fmt::Debug for dyn ValTrait { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "(dyn ValTrait)(")?; - self.fmt(f)?; + self.pretty_fmt(f)?; write!(f, ")") } } @@ -408,8 +408,8 @@ impl ValTrait for Val { } } - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self, f) + fn pretty_fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Display::fmt(&self.pretty(), f) } fn codify(&self) -> String { @@ -554,17 +554,27 @@ impl ToVal for Vec { } } -impl std::fmt::Display for Val { +pub struct PrettyVal<'a> { + val: &'a Val, +} + +impl<'a> Val { + pub fn pretty(&'a self) -> PrettyVal<'a> { + PrettyVal { val: self } + } +} + +impl<'a> std::fmt::Display for PrettyVal<'a> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { + match self.val { Val::Void => write!(f, "void"), Val::Undefined => write!(f, "\x1b[90mundefined\x1b[39m"), Val::Null => write!(f, "\x1b[1mnull\x1b[22m"), - Val::Bool(_) => write!(f, "\x1b[33m{}\x1b[39m", self.val_to_string()), - Val::Number(_) => write!(f, "\x1b[33m{}\x1b[39m", self.val_to_string()), - Val::BigInt(_) => write!(f, "\x1b[33m{}n\x1b[39m", self.val_to_string()), - Val::Symbol(_) => write!(f, "\x1b[32m{}\x1b[39m", self.codify()), - Val::String(_) => write!(f, "\x1b[32m{}\x1b[39m", self.codify()), + Val::Bool(_) => write!(f, "\x1b[33m{}\x1b[39m", self.val.val_to_string()), + Val::Number(_) => write!(f, "\x1b[33m{}\x1b[39m", self.val.val_to_string()), + Val::BigInt(_) => write!(f, "\x1b[33m{}n\x1b[39m", self.val.val_to_string()), + Val::Symbol(_) => write!(f, "\x1b[32m{}\x1b[39m", self.val.codify()), + Val::String(_) => write!(f, "\x1b[32m{}\x1b[39m", self.val.codify()), Val::Array(array) => { if array.elements.len() == 0 { return write!(f, "[]"); @@ -581,7 +591,7 @@ impl std::fmt::Display for Val { write!(f, ", ").expect("Failed to write"); } - write!(f, "{}", elem).expect("Failed to write"); + write!(f, "{}", elem.pretty()).expect("Failed to write"); } write!(f, " ]") @@ -615,10 +625,10 @@ impl std::fmt::Display for Val { if first { first = false; } else { - write!(f, ", ").expect("Failed to write"); + write!(f, ", ")?; } - write!(f, "{}: {}", k, v).expect("Failed to write"); + write!(f, "{}: {}", k, v.pretty())?; } f.write_str(" }") @@ -627,8 +637,8 @@ impl std::fmt::Display for Val { Val::Class(_) => write!(f, "\x1b[36m[Class]\x1b[39m"), // TODO: Improve printing these - Val::Static(s) => s.fmt(f), - Val::Custom(c) => c.fmt(f), + Val::Static(s) => s.pretty_fmt(f), + Val::Custom(c) => c.pretty_fmt(f), } } } diff --git a/vstc/src/run_command.rs b/vstc/src/run_command.rs index 7ffa2fe..f58509f 100644 --- a/vstc/src/run_command.rs +++ b/vstc/src/run_command.rs @@ -46,10 +46,10 @@ pub fn run_command(args: &Vec) { match vm.run(&bytecode, None, &val_args) { Ok(result) => { - println!("{}", result); + println!("{}", result.pretty()); } Err(err) => { - println!("Uncaught exception: {}", err); + println!("Uncaught exception: {}", err.pretty()); exit(1); } }