in smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/httpResponse/bindingTraits/HttpResponseTraitWithHttpPayload.kt [24:76]
override fun render() {
val memberName = ctx.symbolProvider.toMemberName(binding.member)
val target = ctx.model.expectShape(binding.member.target)
val symbol = ctx.symbolProvider.toSymbol(target)
// TODO: properly support event streams and other binary stream types besides blob
val isBinaryStream =
ctx.model.getShape(binding.member.target).get().hasTrait<StreamingTrait>() && target.type == ShapeType.BLOB
writer.openBlock("if case .stream(let reader) = httpResponse.body {", "} else {") {
val extension = if (!isBinaryStream) ".toBytes().toData()" else ""
writer.write("let data = reader$extension")
when (target.type) {
ShapeType.DOCUMENT -> {
writer.openBlock("if let responseDecoder = decoder {", "} else {") {
writer.write(
"let output: \$N = try responseDecoder.decode(responseBody: data)",
symbol
)
writer.write("self.\$L = output", memberName)
}
writer.indent()
writer.write("self.\$L = nil", memberName).closeBlock("}")
}
ShapeType.STRING -> {
writer.openBlock("if let output = \$N(data: data, encoding: .utf8) {", "} else {", SwiftTypes.String) {
if (target.isEnum) {
writer.write("self.\$L = \$L(rawValue: output)", memberName, symbol)
} else {
writer.write("self.\$L = output", memberName)
}
}
writer.indent()
writer.write("self.\$L = nil", memberName).closeBlock("}")
}
ShapeType.BLOB -> {
writer.write("self.\$L = data", memberName)
}
ShapeType.STRUCTURE, ShapeType.UNION -> {
writer.openBlock("if let responseDecoder = decoder {", "} else {") {
writer.write(
"let output: \$N = try responseDecoder.decode(responseBody: data)",
symbol
)
writer.write("self.\$L = output", memberName)
}
writer.indent()
writer.write("self.\$L = nil", memberName).closeBlock("}")
}
else -> throw CodegenException("member shape ${binding.member} serializer not implemented yet")
}
}
writer.indent()
writer.write("self.\$L = nil", memberName).closeBlock("}")
}