package notify import ( "encoding/json" "fmt" ) // ErrorDetails contains structured error information for WebSocket error modals type ErrorDetails struct { Code int `json:"code"` Stacktrace string `json:"stacktrace"` } // SerializeErrorDetails creates a JSON string with code and stacktrace // This is exported so it can be used when creating error notifications func SerializeErrorDetails(code int, err error) string { details := ErrorDetails{ Code: code, Stacktrace: FormatErrorDetails(err), } jsonData, jsonErr := json.Marshal(details) if jsonErr != nil { // Fallback if JSON encoding fails return fmt.Sprintf(`{"code":%d,"stacktrace":"Failed to serialize error"}`, code) } return string(jsonData) } // ParseErrorDetails extracts code and stacktrace from JSON Details field // Returns (code, stacktrace). If parsing fails, returns (500, original details string) func ParseErrorDetails(details string) (int, string) { if details == "" { return 500, "" } var errDetails ErrorDetails err := json.Unmarshal([]byte(details), &errDetails) if err != nil { // Not JSON or malformed - treat as plain stacktrace with default code return 500, details } return errDetails.Code, errDetails.Stacktrace } // FormatErrorDetails extracts and formats error details from wrapped errors func FormatErrorDetails(err error) string { if err == nil { return "" } // Use %+v format to get stack trace from github.com/pkg/errors return fmt.Sprintf("%+v", err) }