@@ -8,7 +8,10 @@ package software.amazon.smithy.swift.codegen.integration
88import software.amazon.smithy.codegen.core.Symbol
99import software.amazon.smithy.codegen.core.SymbolProvider
1010import software.amazon.smithy.model.Model
11+ import software.amazon.smithy.model.shapes.ListShape
12+ import software.amazon.smithy.model.shapes.MapShape
1113import software.amazon.smithy.model.shapes.MemberShape
14+ import software.amazon.smithy.model.shapes.Shape
1215import software.amazon.smithy.model.shapes.StructureShape
1316import software.amazon.smithy.model.traits.ErrorTrait
1417import software.amazon.smithy.model.traits.SensitiveTrait
@@ -25,6 +28,14 @@ class CustomDebugStringConvertibleGenerator(
2528) {
2629 companion object {
2730 const val REDACT_STRING = " CONTENT_REDACTED"
31+
32+ fun Shape.isSensitive (model : Model ): Boolean = when {
33+ this is MemberShape -> model.expectShape(target).isSensitive(model)
34+ hasTrait<SensitiveTrait >() -> true
35+ this is ListShape -> member.isSensitive(model)
36+ this is MapShape -> key.isSensitive(model) || value.isSensitive(model)
37+ else -> false
38+ }
2839 }
2940
3041 private val structSymbol: Symbol by lazy {
@@ -48,14 +59,7 @@ class CustomDebugStringConvertibleGenerator(
4859 private fun renderDescription () {
4960 val symbolName = structSymbol.name
5061 writer.writeInline(" \" $symbolName (" )
51- val membersWithoutSensitiveTrait = membersSortedByName
52- .filterNot { it.hasTrait<SensitiveTrait >() || model.expectShape(it.target).hasTrait<SensitiveTrait >() }
53- .sortedBy { it.memberName }
54- .toList()
55- val membersWithSensitiveTrait = membersSortedByName
56- .filter { it.hasTrait<SensitiveTrait >() || model.expectShape(it.target).hasTrait<SensitiveTrait >() }
57- .sortedBy { it.memberName }
58- .toList()
62+ val (membersWithSensitiveTrait, membersWithoutSensitiveTrait) = membersSortedByName.partition { it.isSensitive(model) }
5963 for (member in membersWithoutSensitiveTrait) {
6064 renderMemberDescription(writer, member, false )
6165 renderComma(writer, member != membersWithoutSensitiveTrait.last())
@@ -77,7 +81,12 @@ class CustomDebugStringConvertibleGenerator(
7781 ) {
7882 val memberNames = symbolProvider.toMemberNames(member)
7983 val path = " properties." .takeIf { shape.hasTrait<ErrorTrait >() } ? : " "
80- val description = if (isRedacted) " \\\" $REDACT_STRING \\\" " else " \\ (${SwiftTypes .String } (describing: $path${memberNames.first} ))"
84+ var description = " "
85+ if (model.expectShape(member.target).isMapShape) {
86+ description = getStringForLoggingMapShape(model.expectShape(member.target).asMapShape().get(), path, memberNames)
87+ } else {
88+ description = if (isRedacted) " \\\" $REDACT_STRING \\\" " else " \\ (${SwiftTypes .String } (describing: $path${memberNames.first} ))"
89+ }
8190 writer.writeInline(" ${memberNames.second} : $description " )
8291 }
8392
@@ -86,4 +95,12 @@ class CustomDebugStringConvertibleGenerator(
8695 writer.writeInline(" , " )
8796 }
8897 }
98+
99+ private fun getStringForLoggingMapShape (member : MapShape , path : String , memberNames : Pair <String , String >): String {
100+ if (member.hasTrait<SensitiveTrait >()) return " \\\" $REDACT_STRING \\\" "
101+ if (member.key.isSensitive(model) && member.value.isSensitive(model)) return " \\\" $REDACT_STRING \\\" "
102+ if (member.key.isSensitive(model)) return " [keys: \\\" $REDACT_STRING \\\" , values: \\ (${SwiftTypes .String } (describing: $path${memberNames.first} ?.values))]"
103+ if (member.value.isSensitive(model)) return " [keys: \\ (${SwiftTypes .String } (describing: $path${memberNames.first} ?.keys)), values: \\\" $REDACT_STRING \\\" ]"
104+ return " \\ (${SwiftTypes .String } (describing: $path${memberNames.first} ))"
105+ }
89106}
0 commit comments