in smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/protocol/HttpStringValuesMapSerializer.kt [44:91]
fun render(
writer: KotlinWriter
) {
bindings.sortedBy(HttpBindingDescriptor::memberName).forEach {
val memberName = symbolProvider.toMemberName(it.member)
val memberTarget = model.expectShape(it.member.target)
val paramName = it.locationName
val location = it.location
val member = it.member
when (memberTarget) {
is CollectionShape -> renderCollectionShape(it, memberTarget, writer)
is TimestampShape -> {
val tsFormat = resolver.determineTimestampFormat(member, location, defaultTimestampFormat)
// headers/query params need to be a string
val formatted = formatInstant("input.$memberName", tsFormat, forceString = true)
writer.write("if (input.#1L != null) append(\"#2L\", #3L)", memberName, paramName, formatted)
writer.addImport(RuntimeTypes.Core.TimestampFormat)
}
is BlobShape -> {
writer.addImport("encodeBase64String", KotlinDependency.UTILS)
writer.write(
"if (input.#1L?.isNotEmpty() == true) append(\"#2L\", input.#1L.encodeBase64String())",
memberName,
paramName
)
}
is StringShape -> renderStringShape(it, memberTarget, writer)
else -> {
// encode to string
val encodedValue = "\"\${input.$memberName}\""
val targetSymbol = symbolProvider.toSymbol(member)
val defaultValue = targetSymbol.defaultValue()
if ((memberTarget.isNumberShape || memberTarget.isBooleanShape) && targetSymbol.isNotBoxed && defaultValue != null) {
// unboxed primitive with a default value
if (member.hasTrait<RequiredTrait>()) {
// always serialize a required member even if it's the default
writer.write("append(#S, #L)", paramName, encodedValue)
} else {
writer.write("if (input.#1L != $defaultValue) append(#2S, #3L)", memberName, paramName, encodedValue)
}
} else {
writer.write("if (input.#1L != null) append(#2S, #3L)", memberName, paramName, encodedValue)
}
}
}
}
}