Merge 50e0aaf86cd8c279bd15e908326182a02e164ff7 into 5dd833f1f26de0eb30eae47b17e05ced2482dc41

This commit is contained in:
Aditya Shukla 2025-10-08 13:05:46 +08:00 committed by GitHub
commit 980ba14a9b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 50 additions and 4 deletions

View File

@ -5,6 +5,7 @@
package gin
import (
"errors"
"fmt"
"reflect"
"strings"
@ -165,11 +166,32 @@ func (a errorMsgs) String() string {
return ""
}
var buffer strings.Builder
for i, msg := range a {
fmt.Fprintf(&buffer, "Error #%02d: %s\n", i+1, msg.Err)
if msg.Meta != nil {
fmt.Fprintf(&buffer, " Meta: %v\n", msg.Meta)
count := 1
for _, msg := range a {
for _, err := range unwrapJoinErr(msg.Err) {
fmt.Fprintf(&buffer, "Error #%02d: %s\n", count, err)
if msg.Meta != nil {
fmt.Fprintf(&buffer, " Meta: %v\n", msg.Meta)
}
count++
}
}
return buffer.String()
}
func unwrapJoinErr(err error) []error {
if err == nil {
return nil
}
var result []error
if multi, ok := err.(interface{ Unwrap() []error }); ok {
for _, e := range multi.Unwrap() {
result = append(result, unwrapJoinErr(e)...)
}
} else if single := errors.Unwrap(err); single != nil {
result = append(result, unwrapJoinErr(single)...)
} else {
result = append(result, err)
}
return result
}

View File

@ -7,6 +7,7 @@ package gin
import (
"errors"
"fmt"
"strings"
"testing"
"github.com/gin-gonic/gin/codec/json"
@ -138,3 +139,26 @@ func TestErrorUnwrap(t *testing.T) {
var testErrNonPointer TestErr
require.ErrorAs(t, wrappedErr, &testErrNonPointer)
}
func TestErrorJoinFormatting(t *testing.T) {
// Create a context with errorMsgs slice
c, _ := CreateTestContext(nil)
// Create a joined error
err1 := errors.New("service error")
err2 := errors.New("store error")
joined := errors.Join(err1, err2)
// Add to context errors
if err := c.Error(joined); err != nil {
t.Fatalf("unexpected error: %v", err)
}
// Call String(), which should now unwrap and format both
output := c.Errors.String()
// Check that both individual errors appear separately
if !strings.Contains(output, "Error #01: service error") || !strings.Contains(output, "Error #02: store error") {
t.Errorf("expected unwrapped errors in output, got:\n%s", output)
}
}