in aws-runtime/protocols/aws-event-stream/common/src/aws/sdk/kotlin/runtime/protocol/eventstream/HeaderValue.kt [117:149]
public fun decode(buffer: Buffer): HeaderValue {
val type = buffer.readByte().let { HeaderType.fromTypeId(it) }
return when (type) {
HeaderType.TRUE -> HeaderValue.Bool(true)
HeaderType.FALSE -> HeaderValue.Bool(false)
HeaderType.BYTE -> HeaderValue.Byte(buffer.readByte().toUByte())
HeaderType.INT16 -> HeaderValue.Int16(buffer.readShort())
HeaderType.INT32 -> HeaderValue.Int32(buffer.readInt())
HeaderType.INT64 -> HeaderValue.Int64(buffer.readLong())
HeaderType.BYTE_ARRAY, HeaderType.STRING -> {
val len = buffer.readUShort()
if (buffer.readRemaining < len.toULong()) {
throw IllegalStateException("Invalid HeaderValue; type=$type, len=$len; readRemaining: ${buffer.readRemaining}")
}
val bytes = ByteArray(len.toInt())
buffer.readFully(bytes)
when (type) {
HeaderType.STRING -> HeaderValue.String(bytes.decodeToString())
HeaderType.BYTE_ARRAY -> HeaderValue.ByteArray(bytes)
else -> throw IllegalStateException("Invalid HeaderValue")
}
}
HeaderType.TIMESTAMP -> {
val epochMilli = buffer.readLong()
HeaderValue.Timestamp(Instant.fromEpochMilliseconds(epochMilli))
}
HeaderType.UUID -> {
val high = buffer.readLong()
val low = buffer.readLong()
HeaderValue.Uuid(Uuid(high, low))
}
}
}