54 lines
1.5 KiB
Go
54 lines
1.5 KiB
Go
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)
|
|
}
|