Skip to content

Commit 0bba8f5

Browse files
authored
codegen: Dont serialize nil for visited nested event stream shapes (#3934)
Updates the SDK's code gen to not encode entries as `nil` for shapes that have already been visited. This skips `nil`'s in nested slice and map event stream shapes. Related to bigger issue of SDK's JSON serializer does not correctly skip, or serailize NULL for nil values in slices.
1 parent e0475a0 commit 0bba8f5

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

private/model/api/eventstream_tmpl_tests.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,8 @@ func templateMap(args ...interface{}) map[string]interface{} {
7070
}
7171

7272
func valueForType(s *Shape, visited []string) string {
73-
for _, v := range visited {
74-
if v == s.ShapeName {
75-
return "nil"
76-
}
73+
if isShapeVisited(visited, s.ShapeName) {
74+
return "nil"
7775
}
7876

7977
visited = append(visited, s.ShapeName)
@@ -116,17 +114,21 @@ func valueForType(s *Shape, visited []string) string {
116114
case "list":
117115
w := bytes.NewBuffer(nil)
118116
fmt.Fprintf(w, "%s{\n", s.GoType())
119-
for i := 0; i < 3; i++ {
120-
fmt.Fprintf(w, "%s,\n", valueForType(s.MemberRef.Shape, visited))
117+
if !isShapeVisited(visited, s.MemberRef.Shape.ShapeName) {
118+
for i := 0; i < 3; i++ {
119+
fmt.Fprintf(w, "%s,\n", valueForType(s.MemberRef.Shape, visited))
120+
}
121121
}
122122
fmt.Fprintf(w, "}")
123123
return w.String()
124124

125125
case "map":
126126
w := bytes.NewBuffer(nil)
127127
fmt.Fprintf(w, "%s{\n", s.GoType())
128-
for _, k := range []string{"a", "b", "c"} {
129-
fmt.Fprintf(w, "%q: %s,\n", k, valueForType(s.ValueRef.Shape, visited))
128+
if !isShapeVisited(visited, s.ValueRef.Shape.ShapeName) {
129+
for _, k := range []string{"a", "b", "c"} {
130+
fmt.Fprintf(w, "%q: %s,\n", k, valueForType(s.ValueRef.Shape, visited))
131+
}
130132
}
131133
fmt.Fprintf(w, "}")
132134
return w.String()
@@ -135,3 +137,12 @@ func valueForType(s *Shape, visited []string) string {
135137
panic(fmt.Sprintf("valueForType does not support %s, %s", s.ShapeName, s.Type))
136138
}
137139
}
140+
141+
func isShapeVisited(visited []string, name string) bool {
142+
for _, v := range visited {
143+
if v == name {
144+
return true
145+
}
146+
}
147+
return false
148+
}

0 commit comments

Comments
 (0)