in crumb-compiler/src/main/kotlin/com/uber/crumb/internal/wire/internal/RuntimeMessageAdapter.kt [61:87]
override fun redact(value: M): M {
val builder = value.newBuilder()
for (fieldBinding in fieldBindings.values) {
if (fieldBinding.redacted && fieldBinding.label == WireField.Label.REQUIRED) {
throw UnsupportedOperationException(
"Field '${fieldBinding.name}' in ${type?.javaObjectType?.name} is required and " +
"cannot be redacted.")
}
val isMessage = Message::class.java
.isAssignableFrom(fieldBinding.singleAdapter().type?.javaObjectType)
if (fieldBinding.redacted || isMessage && !fieldBinding.label.isRepeated) {
val builderValue = fieldBinding.getFromBuilder(builder)
if (builderValue != null) {
val redactedValue = fieldBinding.adapter().redact(builderValue)
fieldBinding[builder] = redactedValue
}
} else if (isMessage && fieldBinding.label.isRepeated) {
@Suppress("UNCHECKED_CAST")
val values = fieldBinding.getFromBuilder(builder) as List<Any>
@Suppress("UNCHECKED_CAST")
val adapter = fieldBinding.singleAdapter() as ProtoAdapter<Any>
fieldBinding[builder] = values.redactElements(adapter)
}
}
builder.clearUnknownFields()
return builder.build()
}