Skip to content

Commit 8fe9081

Browse files
authored
fix: Properly handle map and slice pointers (#1817)
#### Summary I missed this in #1796. Actually added the `normalizePointer` for this reason just forgot to use it for map and slice pointers ---
1 parent 2e1112f commit 8fe9081

2 files changed

Lines changed: 26 additions & 6 deletions

File tree

transformers/struct.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -271,11 +271,11 @@ func normalizePointer(field reflect.StructField) reflect.Value {
271271
}
272272

273273
func (t *structTransformer) fieldToJSONSchema(field reflect.StructField, depth int) any {
274-
transformInput := normalizePointer(field)
275-
switch transformInput.Elem().Kind() {
274+
normalizedField := normalizePointer(field)
275+
switch normalizedField.Elem().Kind() {
276276
case reflect.Struct:
277277
fieldsMap := make(map[string]any)
278-
fieldType := transformInput.Elem().Type()
278+
fieldType := normalizedField.Elem().Type()
279279
for i := 0; i < fieldType.NumField(); i++ {
280280
name, err := t.nameTransformer(fieldType.Field(i))
281281
if err != nil {
@@ -304,13 +304,13 @@ func (t *structTransformer) fieldToJSONSchema(field reflect.StructField, depth i
304304
return fieldsMap
305305
case reflect.Map:
306306
keySchema, ok := t.fieldToJSONSchema(reflect.StructField{
307-
Type: field.Type.Key(),
307+
Type: normalizedField.Elem().Type().Key(),
308308
}, depth+1).(string)
309309
if keySchema == "" || !ok {
310310
return ""
311311
}
312312
valueSchema := t.fieldToJSONSchema(reflect.StructField{
313-
Type: field.Type.Elem(),
313+
Type: normalizedField.Elem().Type().Elem(),
314314
}, depth+1)
315315
if valueSchema == "" {
316316
return ""
@@ -320,7 +320,7 @@ func (t *structTransformer) fieldToJSONSchema(field reflect.StructField, depth i
320320
}
321321
case reflect.Slice:
322322
valueSchema := t.fieldToJSONSchema(reflect.StructField{
323-
Type: field.Type.Elem(),
323+
Type: normalizedField.Elem().Type().Elem(),
324324
}, depth+1)
325325
if valueSchema == "" {
326326
return ""

transformers/struct_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,15 @@ func TestJSONTypeSchema(t *testing.T) {
496496
"tags": `{"utf8":"utf8"}`,
497497
},
498498
},
499+
{
500+
name: "simple map pointer",
501+
testStruct: struct {
502+
Tags *map[string]string `json:"tags"`
503+
}{},
504+
want: map[string]string{
505+
"tags": `{"utf8":"utf8"}`,
506+
},
507+
},
499508
{
500509
name: "simple array",
501510
testStruct: struct {
@@ -507,6 +516,17 @@ func TestJSONTypeSchema(t *testing.T) {
507516
"items": `[{"name":"utf8"}]`,
508517
},
509518
},
519+
{
520+
name: "simple array pointer",
521+
testStruct: struct {
522+
Items *[]struct {
523+
Name string `json:"name"`
524+
} `json:"items"`
525+
}{},
526+
want: map[string]string{
527+
"items": `[{"name":"utf8"}]`,
528+
},
529+
},
510530
{
511531
name: "simple struct",
512532
testStruct: struct {

0 commit comments

Comments
 (0)