Skip to content

Commit 44d0dd7

Browse files
authored
fix: Add pointer support for url query params (#3659) (#3666)
The pointer support in url query params (using []*Struct for binding query params) was previously available in Gin, but was removed in commit 0d50ce8 since there wasn't a test case for such a scenario, and so the case block was removed as a redundant one.
1 parent 49f45a5 commit 44d0dd7

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

binding/form_mapping.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,11 @@ func setWithProperType(val string, value reflect.Value, field reflect.StructFiel
239239
return json.Unmarshal(bytesconv.StringToBytes(val), value.Addr().Interface())
240240
case reflect.Map:
241241
return json.Unmarshal(bytesconv.StringToBytes(val), value.Addr().Interface())
242+
case reflect.Ptr:
243+
if !value.Elem().IsValid() {
244+
value.Set(reflect.New(value.Type().Elem()))
245+
}
246+
return setWithProperType(val, value.Elem(), field)
242247
default:
243248
return errUnknownType
244249
}

binding/form_mapping_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,39 @@ func TestMappingStructField(t *testing.T) {
269269
assert.Equal(t, 9, s.J.I)
270270
}
271271

272+
func TestMappingPtrField(t *testing.T) {
273+
type ptrStruct struct {
274+
Key int64 `json:"key"`
275+
}
276+
277+
type ptrRequest struct {
278+
Items []*ptrStruct `json:"items" form:"items"`
279+
}
280+
281+
var err error
282+
283+
// With 0 items.
284+
var req0 ptrRequest
285+
err = mappingByPtr(&req0, formSource{}, "form")
286+
assert.NoError(t, err)
287+
assert.Empty(t, req0.Items)
288+
289+
// With 1 item.
290+
var req1 ptrRequest
291+
err = mappingByPtr(&req1, formSource{"items": {`{"key": 1}`}}, "form")
292+
assert.NoError(t, err)
293+
assert.Len(t, req1.Items, 1)
294+
assert.EqualValues(t, 1, req1.Items[0].Key)
295+
296+
// With 2 items.
297+
var req2 ptrRequest
298+
err = mappingByPtr(&req2, formSource{"items": {`{"key": 1}`, `{"key": 2}`}}, "form")
299+
assert.NoError(t, err)
300+
assert.Len(t, req2.Items, 2)
301+
assert.EqualValues(t, 1, req2.Items[0].Key)
302+
assert.EqualValues(t, 2, req2.Items[1].Key)
303+
}
304+
272305
func TestMappingMapField(t *testing.T) {
273306
var s struct {
274307
M map[string]int

0 commit comments

Comments
 (0)