in smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/ShapeValueGenerator.kt [221:277]
override fun objectNode(node: ObjectNode) {
var i = 0
// this is important because when a struct is generated in swift it is generated with its members sorted by name.
// when you instantiate that struct you have to call params in order with their param names. if you don't it won't compile
// so we sort here before we write any of the members with their values
val sortedMembers = node.members.toSortedMap(compareBy<StringNode> { it.value.lowercase() })
sortedMembers.forEach { (keyNode, valueNode) ->
val memberShape: Shape
when (currShape) {
is StructureShape -> {
val member = currShape.getMember(keyNode.value).orElseThrow {
CodegenException("unknown member ${currShape.id}.${keyNode.value}")
}
val recursiveMemberWithTrait = member.hasTrait(SwiftBoxTrait::class.java)
memberShape = generator.model.expectShape(member.target)
val memberName = generator.symbolProvider.toMemberNames(member).second
// NOTE - `write()` appends a newline and keeps indentation,
// `writeInline()` doesn't keep indentation but also doesn't append a newline
// ...except it does insert indentation if it encounters a newline.
// This is our workaround for the moment to keep indentation but not insert
// a newline at the end.
writer.writeInline("\n\$L: ", memberName)
generator.writeShapeValueInline(writer, memberShape, valueNode, recursiveMemberWithTrait)
if (i < node.members.size - 1) {
writer.writeInline(",")
}
}
is MapShape -> {
memberShape = generator.model.expectShape(currShape.value.target)
writer.writeInline("\n\$S: ", keyNode.value)
if (valueNode.isNullNode) {
writer.writeInline("nil")
} else {
generator.writeShapeValueInline(writer, memberShape, valueNode)
}
if (i < node.members.size - 1) {
writer.writeInline(",")
}
}
is UnionShape -> {
val member = currShape.getMember(keyNode.value).orElseThrow {
CodegenException("unknown member ${currShape.id}.${keyNode.value}")
}
memberShape = generator.model.expectShape(member.target)
writer.writeInline("\$L(", lowerCase(keyNode.value))
generator.writeShapeValueInline(writer, memberShape, valueNode)
}
else -> throw CodegenException("unexpected shape type " + currShape.type)
}
i++
}
if (sortedMembers.isEmpty()) {
when (currShape) {
is MapShape -> writer.writeInline(":") // to pass an empty map you need to have a colon like `[:]`
}
}
}