diff --git a/rust/src/modules/vmerror/display.rs b/rust/src/modules/vmerror/display.rs index b8a6d1d1..a54b1bb4 100644 --- a/rust/src/modules/vmerror/display.rs +++ b/rust/src/modules/vmerror/display.rs @@ -131,7 +131,6 @@ impl fmt::Display for VMError { } VMError::SystemError(s) => write!(f, "{}", s), }?; - write!(f, "\n{}", self.diagnostic_link())?; if !matches!(self, VMError::SystemError(_)) { if is_hint { write!( @@ -144,6 +143,11 @@ impl fmt::Display for VMError { write!(f, "\n {DARK_GRAY}error type: {}", err_type)?; } } + write!( + f, + "\n {RESET}{CYAN}├── {DARK_GRAY}documentation: {}{RESET}", + self.diagnostic_link() + )?; if is_backtrace { let backtrace = get_backtrace(); write!( diff --git a/rust/src/modules/vmerror/error.rs b/rust/src/modules/vmerror/error.rs index 39b1e405..230fc6c2 100644 --- a/rust/src/modules/vmerror/error.rs +++ b/rust/src/modules/vmerror/error.rs @@ -182,23 +182,53 @@ mod tests { #[test] fn formatted_error_contains_its_diagnostic_link() { + set_thread_error_config(false, false, true); let error = VMError::StackOverflow { ip: 1, limit: 2 }; + let formatted = error.to_string(); + let metadata_position = formatted.find("error type:").unwrap(); + let documentation_position = formatted.find("documentation:").unwrap(); + let hint_position = formatted.find("hint:").unwrap(); - assert!(error.to_string().contains(&error.diagnostic_link())); + assert!( + formatted.contains(&format!("documentation: {}", error.diagnostic_link())) + ); + assert!(formatted.contains("\x1b[36m├── \x1b[2;37mdocumentation:")); + assert!(metadata_position < documentation_position); + assert!(documentation_position < hint_position); } #[test] fn formatted_system_error_contains_its_diagnostic_link() { + set_thread_error_config(false, false, true); let error = VMError::SystemError(SmolStr::new("system failure")); + let formatted = error.to_string(); + let error_position = formatted.find("system failure").unwrap(); + let documentation_position = formatted.find("documentation:").unwrap(); + let hint_position = formatted.find("hint:").unwrap(); - assert!(error.to_string().contains(&error.diagnostic_link())); + assert!(formatted.contains(&error.diagnostic_link())); + assert!(error_position < documentation_position); + assert!(documentation_position < hint_position); } #[test] fn diagnostic_link_is_rendered_when_hints_are_disabled() { set_thread_error_config(false, false, false); let error = VMError::StackOverflow { ip: 1, limit: 2 }; + let formatted = error.to_string(); - assert!(error.to_string().contains(&error.diagnostic_link())); + assert!(formatted.contains(&error.diagnostic_link())); + assert!(formatted.contains("documentation:")); + } + + #[test] + fn diagnostic_link_is_rendered_before_backtrace() { + set_thread_error_config(true, false, true); + let error = VMError::StackOverflow { ip: 1, limit: 2 }; + let formatted = error.to_string(); + let documentation_position = formatted.find("documentation:").unwrap(); + let backtrace_position = formatted.find("internal backtrace:").unwrap(); + + assert!(documentation_position < backtrace_position); } }