我有一个conent信封,其中的消息是一个字符串,可能是base64编码的,如果可能的话,还可以gzip。下面的消息方法处理对消息进行编码和压缩的情况。然而,为了清楚起见,以某种方式提取模式是很好的,scala是否提供了这样做的工具?
case class Content(Message: String,
MessageAttributes: Option[MessageAttributes])
case class MessageAttributes(compression: Option[MessageAttribute],
encoding: Option[MessageAttribute])
case class MessageAttribute(Type: String, Value: String)
我想做什么(当然,在模式中使用base64编码和压缩只会影响我的val):
def message: String = {
val withBase64EncodingAndCompression =
Some(MessageAttributes(Some(MessageAttribute("String", "gzip")), Some(MessageAttribute("String", "base64"))))
parsed.extract[Content] match {
case Content(message, withBase64EncodingAndCompression) =>
val decoded = Base64.getDecoder.decode(message)
GZIPCompression.decompress(decoded)
case _ => message
}
}
我要做的是:
def message: String = {
parsed.extract[Content] match {
case Content(message, Some(MessageAttributes(Some(MessageAttribute("String", "gzip")), Some(MessageAttribute("String", "base64"))))) =>
val decoded = Base64.getDecoder.decode(message)
GZIPCompression.decompress(decoded)
case _ => message
}
我已经从下面修改了Vitalii Honta的答案。名字是不同的,我已经删除了我的无限递归,但这显示了我所追求的——尽可能多地将模式移到case子句之外。
def sqsEnvelopeMessage: String = {
val sqsEnvelope = SqsEnvelope(parsed)
val withBase64EncodingAndCompression = Some(SqsEnvelopeAttributes(Some(SqsEnvelopeAttribute("String", "base64")), Some(SqsEnvelopeAttribute("String", "gzip"))))
sqsEnvelope match {
case SqsEnvelope(message, `withBase64EncodingAndCompression`) =>
val decoded = Base64.getDecoder.decode(message)
GZIPCompressionUtil.decompress(decoded)
case SqsEnvelope(message, _) =>
message
}
}