File tree Expand file tree Collapse file tree 2 files changed +48
-4
lines changed Expand file tree Collapse file tree 2 files changed +48
-4
lines changed Original file line number Diff line number Diff line change 5
5
package gin
6
6
7
7
import (
8
+ "errors"
8
9
"fmt"
9
10
"reflect"
10
11
"strings"
@@ -165,11 +166,32 @@ func (a errorMsgs) String() string {
165
166
return ""
166
167
}
167
168
var buffer strings.Builder
168
- for i , msg := range a {
169
- fmt .Fprintf (& buffer , "Error #%02d: %s\n " , i + 1 , msg .Err )
170
- if msg .Meta != nil {
171
- fmt .Fprintf (& buffer , " Meta: %v\n " , msg .Meta )
169
+ count := 1
170
+ for _ , msg := range a {
171
+ for _ , err := range unwrapJoinErr (msg .Err ) {
172
+ fmt .Fprintf (& buffer , "Error #%02d: %s\n " , count , err )
173
+ if msg .Meta != nil {
174
+ fmt .Fprintf (& buffer , " Meta: %v\n " , msg .Meta )
175
+ }
176
+ count ++
172
177
}
173
178
}
174
179
return buffer .String ()
175
180
}
181
+
182
+ func unwrapJoinErr (err error ) []error {
183
+ if err == nil {
184
+ return nil
185
+ }
186
+ var result []error
187
+ if multi , ok := err .(interface { Unwrap () []error }); ok {
188
+ for _ , e := range multi .Unwrap () {
189
+ result = append (result , unwrapJoinErr (e )... )
190
+ }
191
+ } else if single := errors .Unwrap (err ); single != nil {
192
+ result = append (result , unwrapJoinErr (single )... )
193
+ } else {
194
+ result = append (result , err )
195
+ }
196
+ return result
197
+ }
Original file line number Diff line number Diff line change @@ -7,6 +7,7 @@ package gin
7
7
import (
8
8
"errors"
9
9
"fmt"
10
+ "strings"
10
11
"testing"
11
12
12
13
"github.com/gin-gonic/gin/internal/json"
@@ -138,3 +139,24 @@ func TestErrorUnwrap(t *testing.T) {
138
139
var testErrNonPointer TestErr
139
140
require .ErrorAs (t , wrappedErr , & testErrNonPointer )
140
141
}
142
+
143
+ func TestErrorJoinFormatting (t * testing.T ) {
144
+ // Create a context with errorMsgs slice
145
+ c , _ := CreateTestContext (nil )
146
+
147
+ // Create a joined error
148
+ err1 := errors .New ("service error" )
149
+ err2 := errors .New ("store error" )
150
+ joined := errors .Join (err1 , err2 )
151
+
152
+ // Add to context errors
153
+ c .Error (joined )
154
+
155
+ // Call String(), which should now unwrap and format both
156
+ output := c .Errors .String ()
157
+
158
+ // Check that both individual errors appear separately
159
+ if ! strings .Contains (output , "Error #01: service error" ) || ! strings .Contains (output , "Error #02: store error" ) {
160
+ t .Errorf ("expected unwrapped errors in output, got:\n %s" , output )
161
+ }
162
+ }
You can’t perform that action at this time.
0 commit comments