diff --git a/rpc/src/error.rs b/rpc/src/error.rs index 753f747dbe..ee2f74347c 100644 --- a/rpc/src/error.rs +++ b/rpc/src/error.rs @@ -121,6 +121,32 @@ pub enum RPCError { Indexer = -1200, } +/// Removes the backtrace portion from an error string. +/// +/// This function processes the input string `err_str` line by line and collects all lines +/// until it encounters a line starting with "Stack backtrace:". It then joins the collected +/// lines into a single string, effectively removing the backtrace section. +/// +/// # Arguments +/// * `err_str` - A string slice containing the error message, potentially including a backtrace. +/// +/// # Returns +/// * A `String` containing the error message without the backtrace. +/// +/// # Example +/// ``` +/// let error_message = "Error: Something went wrong\nStack backtrace:\n1: some_function\n2: another_function"; +/// let cleaned_message = remove_backtrace(error_message); +/// assert_eq!(cleaned_message, "Error: Something went wrong"); +/// ``` +fn remove_backtrace(err_str: &str) -> String { + let lines: Vec<_> = err_str + .lines() + .take_while(|line| !line.starts_with("Stack backtrace:")) + .collect(); + lines.join("\n") +} + impl RPCError { /// Invalid method parameter(s). pub fn invalid_params(message: T) -> Error { @@ -158,10 +184,12 @@ impl RPCError { /// The parameter `err` is usually an std error. The Display form is used as the error message, /// and the Debug form is used as the data. pub fn custom_with_error(error_code: RPCError, err: T) -> Error { + let err_str_with_backtrace = format!("{err:?}"); + let err_str = remove_backtrace(&err_str_with_backtrace); Error { code: ErrorCode::ServerError(error_code as i64), message: format!("{error_code:?}: {err}"), - data: Some(Value::String(format!("{err:?}"))), + data: Some(Value::String(err_str)), } }